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

相关文章

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.