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

相关文章

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.