最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容,但是没有强调版本,造成我在搭建环境以及编码时阻碍重重,本篇的重点主要是针对几个遇到的问题,强调版本的重要性以及这个问题的主要思路。

  环境介绍

  eclipse:  eclipse-dsl-luna-SR1a-win32(32位)

  jdk:    jdk1.6.0_22(32位)

  opengl:  eclipse-opengl-0.5.0-win32

  一、opengl环境搭建

  1.下载opengl在eclipse下的插件eclipse-opengl-0.5.0-win32

  下载链接:http://www.eclipse.org/swt/opengl/

  其文件目录结构:

  

  2.将两个文件夹org.eclipse.opengl.win32.x86_0.5.0和org.eclipse.opengl_0.5.0分别放入eclipse解压目录下的plugins文件夹中

  

  另外还需要将org.eclipse.opengl_0.5.0下的ogl.jar放入上面文件夹中。

  3.为了解决错误提示类库没有加载的问题,将org.eclipse.opengl.win32.x86_0.5.0文件夹下的gl-0500.dll库文件放入jdk的bin文件夹中。

  注意:之所以如此强调版本,是因为之前在搭好了eclipse以及编写好代码后,本以为可以完美的出结果,可是点击run按钮,发现报了个错,说是无法再64位平台加载32位应用,经查找发现是下载的opengl是32位的,之后在链接http://www.eclipse.org/swt/opengl/中也没有找到64位的opengl插件。

  所以就重新换了个思路,将jdk换成了32位的,但是此时又报错不能再32位平台下加载64位的SWT环境,尝试过更换eclipse(注意,起初的eclipse是64位的)下的plugin中的swt为32,结果在添加依赖插件时发现无效,仍然加载的是64位,添加依赖opengl插件如下图所示:

  
  这次,准备来个大换血,将eclipse也换掉,弄成个32位,这下齐活了,都是32位,应该没有什么问题了,开始编写代码。

  二、创建Eclipse RCP项目并编写opengl绘图程序

  1.新建Plug-in Project

  在Eclipse中打开File->New->other选择Plug-in Project

  

  2.新建完成后,我们得到以下的项目目录结构

  

  从包com.cntrust.jack中我们可以发现共有5个类

  首先从Application开始,主要通过调用PlatformUI.createAndRunWorkbench(Display, WorkbenchWindowAdvisor)方法启动Workbench;

  然后跳转到ApplicationWorkbenchAdvisor类中,该类主要做了两方面的工作;

  (1)要显示的初始透视图(就是com.cntrust.jack包下的Perspective类所要做的工作);

  (2)要使用的WorkbenchWindowAdvisor。

  再者就是ApplicationWorkbenchWindowAdvisor类,它在渲染窗口方面将指导UI;

  最后一个是ApplicationActionBarAdvisor类,其创建了一个窗口所需要的动作,并在窗口中定位它们。

  3.添加视图

  打开plugin.xml文件,切换到Extensions下,点击Add按钮,输入org.eclipse.ui.views,点击确定,则在上面的窗口会看到org.eclipse.ui.views,鼠标右键new->view,在右边的“Extension Element Details”中填写相应的信息,如图所示:

  

  在得到的ContactsView类中,我们先定义一个ID,方便后面透视图布局时会用到。

  4.在ContactsView类中的createPartControl()方法下编写代码:

GLCanvas canvas;

	@Override
public void createPartControl(Composite parent) { GLData data = new GLData();
data.depthSize = 1;
data.doubleBuffer = true;
canvas = new GLCanvas(parent, SWT.NO_BACKGROUND, data);
canvas.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Rectangle rect = canvas.getClientArea();
GL.glViewport(0, 0, rect.width, rect.height); // 选择投影矩阵
GL.glMatrixMode(GL.GL_PROJECTION);
// 重置投影矩阵
GL.glLoadIdentity();
// 设置窗口比例和透视图
GLU.gluPerspective(45.0f, (float) rect.width
/ (float) rect.height, 0.1f, 100.0f);
// 选择模型观察矩阵
GL.glMatrixMode(GL.GL_MODELVIEW);
// 重置模型观察矩阵
GL.glLoadIdentity(); // 黑色背景
GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 设置深度缓存
GL.glClearDepth(1.0f);
// 启动深度测试
GL.glEnable(GL.GL_DEPTH_TEST);
// 选择深度测试类型
GL.glDepthFunc(GL.GL_LESS);
// 启用阴影平滑
GL.glShadeModel(GL.GL_SMOOTH);
// 精细修正透视图
GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
// 清除屏幕和深度缓存
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// 重置当前的模型观察矩阵
GL.glLoadIdentity();
}
});
canvas.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dispose();
}
}); Refresher rf = new Refresher(canvas);
rf.run();
}

  同时创建类Refresher:

class Refresher implements Runnable {
public static final int DELAY = 100; private GLCanvas canvas;
private float rotate = 0.0f; public Refresher(GLCanvas canvas) {
this.canvas = canvas;
} public void run() {
if (this.canvas != null && !this.canvas.isDisposed()) {
if (!canvas.isCurrent()) {
canvas.setCurrent();
}
// 这里添加OpenGL绘图代码
GL.glLoadIdentity();
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glTranslatef(0, 4.5f, -11);
// 围绕y轴转起来
rotate += 0.5;
GL.glRotatef(rotate, 0, 1.0f, 0);
// 调用递归函数,绘制三菱锥矩阵
drawPyramid(0, 0, 0, 4);
canvas.swapBuffers();
this.canvas.getDisplay().timerExec(DELAY, this);
}
} public void drawPyramid(float x, float y, float z, int n) {
if (n == 0)
return;
// 画一个三菱锥
GL.glBegin(GL.GL_TRIANGLES);
// 画背面
GL.glColor3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(x, y, z);
GL.glColor3f(0.0f, 1.0f, 0.0f);
GL.glVertex3f(x + 1.0f, y - 1.63f, z - 0.57f);
GL.glColor3f(0.0f, 0.0f, 1.0f);
GL.glVertex3f(x - 1.0f, y - 1.63f, z - 0.57f);
// 画底面
GL.glColor3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(x, y - 1.63f, z + 1.15f);
GL.glColor3f(0.0f, 1.0f, 0.0f);
GL.glVertex3f(x - 1.0f, y - 1.63f, z - 0.57f);
GL.glColor3f(0.0f, 0.0f, 1.0f);
GL.glVertex3f(x + 1.0f, y - 1.63f, z - 0.57f);
// 画左侧面
GL.glColor3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(x, y, z);
GL.glColor3f(0.0f, 1.0f, 0.0f);
GL.glVertex3f(x - 1.0f, y - 1.63f, z - 0.57f);
GL.glColor3f(0.0f, 0.0f, 1.0f);
GL.glVertex3f(x, y - 1.63f, z + 1.15f);
// 画右侧面
GL.glColor3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(x, y, z);
GL.glColor3f(0.0f, 1.0f, 0.0f);
GL.glVertex3f(x, y - 1.63f, z + 1.15f);
GL.glColor3f(0.0f, 0.0f, 1.0f);
GL.glVertex3f(x + 1.0f, y - 1.63f, z - 0.57f);
GL.glEnd();
// 递归调用,画多个三菱锥
drawPyramid(x, y - 1.63f, z + 1.15f, n - 1);
drawPyramid(x - 1.0f, y - 1.63f, z - 0.57f, n - 1);
drawPyramid(x + 1.0f, y - 1.63f, z - 0.57f, n - 1);
}
}

  

  5.在项目上右键run as->eclipse application,得到结果如下:

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                          2. 微信

                      

  如果对你有用,欢迎点赞哦,也欢迎加入可视化群227963113讨论^_^

  本文链接《可视化(番外篇)——在Eclipse RCP中玩转OpenGL

  参考文献:http://www.thinksaas.cn/group/topic/319162/

可视化(番外篇)——在Eclipse RCP中玩转OpenGL的更多相关文章

  1. 可视化(番外篇)——SWT总结

    本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可 ...

  2. 番外篇1:在Windows环境中安装JDK

    他山之石,可以攻玉!欢迎关注我的微信公众号 本文作为构建第一个Java程序的番外篇一,跟大家探讨下在Windows下怎么安装JDK.由于本人没有Mac,因此如果是Mac的同学,请自行百度哦! 读前预览 ...

  3. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  4. 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示

    一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ...

  5. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  7. 【重走Android之路】【番外篇】关于==和equals

    [重走Android之路][番外篇]关于==和equals   在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...

  8. 【重走Android之路】【番外篇】有关于null的一些知识点

    [重走Android之路][番外篇]有关于null的一些知识点   1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...

  9. 番外篇 之 C#委托

    对于上一节 番外篇之C#多线程的反思 反思一:   Thread th = new Thread(参数); ////参数的总结 ////首先,第一情况,对于 Thread th = new Threa ...

随机推荐

  1. String 归档

    1.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:,请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 设计思想: 1)输入一个字符串str( ...

  2. 。net初学

    这一周主要是对.net语法基础知识的简介以及一些作业练习,大部分还是与c语言有关联.一开始语法上有差异,写起代码来有困难,逻辑有点转换不过来.但是通过上周的练习,现在写起 作业来,还是挺快的.     ...

  3. .NET转Java学习规则

    做一个个人Blog(博客) 过程分3个大阶段: 使用servlet/jsp和jdbc,mysql完成第一阶段Blog 项目修改为Spring(IOC+MVC)+SpringJdbc+MyBatis模式 ...

  4. 可在广域网部署运行的QQ高仿版 -- GG叽叽V2.0,增加网盘和远程磁盘功能(源码)

    尽力2~3周发布一个版本,我这次也没有失言.这段时间内,我仿照QQ的微云功能,在GG中增加了网盘的功能,而且,我还自创了一个QQ没有的新的功能:远程磁盘.正如远程桌面一样,远程磁盘允许我们像访问本地磁 ...

  5. Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

    前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...

  6. Etag缓存在PHP和NodeJS中的实现

    HTTP 提供了许多页面缓存的方案,其中属 Etag 和 Last-Modified 应用最广.本文会先介绍 Etag 的应用场景,然后说说他在 php 和 node 中的使用. 本文地址:http: ...

  7. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  8. 由ASP.NET所谓前台调用后台、后台调用前台想到HTTP——理论篇

    工作两年多了,我会经常尝试给公司小伙伴儿们解决一些问题,几个月下来我发现初入公司的小朋友最爱问的问题就三个 1. 我想前台调用后台的XXX方法怎么弄啊? 2. 我想后台调用前台的XXX JavaScr ...

  9. 关于基本类型值和引用类型值以及Vue官方API的array.$remove(reference)

    今天又是孟哥解惑. 数组里的元素也是指向内存地址么? 这个要分情况的. 无论a[0],a[2]在什么地方,只要其值是基本类型值,就是值的比较,只要其值是引用类型(对象),就是内存地址的比较. Vue官 ...

  10. CSS水平垂直居中的几种方法2

    直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: div{ width: 400px; height: 400px; position: relative; b ...