Eclipse下的SWT的OpenGL开发(实例及源码)RCP旋转的彩色三棱锥

2023-12-14 17:48

本文主要是介绍Eclipse下的SWT的OpenGL开发(实例及源码)RCP旋转的彩色三棱锥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

配置如上篇Eclipse下的SWT的OpenGL开发(配置、实例及源码)正弦波

新建插件工程,选中rcp,选择带视图模板的,finish。此时就有一个完整的带有视图的rcp程序。

然后添加依赖org.eclipse.opengl;bundle-version="0.5.0",创建类Refresher

package sdsd;import org.eclipse.opengl.GL;
import org.eclipse.swt.opengl.GLCanvas;class Refresher implements Runnable {public static final int DELAY = 100;private final GLCanvas canvas;private float rotate = 0.0f;public Refresher(final GLCanvas canvas) {this.canvas = canvas;}@Overridepublic void run() {if (canvas != null && !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();canvas.getDisplay().timerExec(DELAY, this);}}public void drawPyramid(final float x, final float y, final float z, final 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);}
}


然后改写view类的代码为:

package sdsd;import org.eclipse.opengl.GL;
import org.eclipse.opengl.GLU;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;public class View extends ViewPart {GLCanvas canvas;public View() {// TODO Auto-generated constructor stub}@Overridepublic void createPartControl(final Composite parent) {// TODO Auto-generated method stubfinal GLData data = new GLData();data.depthSize = 1;data.doubleBuffer = true;canvas = new GLCanvas(parent, SWT.NO_BACKGROUND, data);canvas.addControlListener(new ControlAdapter() {@Overridepublic void controlResized(final ControlEvent e) {final 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() {@Overridepublic void widgetDisposed(final DisposeEvent e) {dispose();}});final Refresher rf = new Refresher(canvas);rf.run();}@Overridepublic void setFocus() {// TODO Auto-generated method stub}}


转自。http://www.blogjava.net/youxia/archive/2006/12/09/86513.html

这篇关于Eclipse下的SWT的OpenGL开发(实例及源码)RCP旋转的彩色三棱锥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493453

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6