比较急搞了几天了,OPENGL实现鼠标托动控制物体旋转的问题。
double[] lastMatrix = new double[16] // 前一次矩阵,初始化为单位矩阵E
{1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0};
private double theta; // 旋转角度
private double[] axis = new double[3]; // 旋转轴
private double[] lastPos = new double[3], curPos = new double[3]; // 鼠标上次和当前坐标
private int hemishere(int x, int y, int d,double[] v)
{
double z;
// 计算x, y坐标
v[0] = (double)x * 2.0 - (double)d;
v[1] = (double)d - (double)y * 2.0;
// 计算z坐标
z = d * d - v[0] * v[0] - v[1] * v[1];
if (z < 0)
{
return 0;
}
v[2] = Math.Sqrt(z);
// 单位化
v[0] /= (double)d;
v[1] /= (double)d;
v[2] /= (double)d;
return 1;
}
private void openGLControl1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
double d, dx, dy, dz;
// 计算当前的鼠标单位半球面坐标
if (hemishere(e.X, e.Y, 500, curPos)!=1)
{
return;
}
// 计算移动量的三个方向分量
dx = curPos[0] - lastPos[0];
dy = curPos[1] - lastPos[1];
dz = curPos[2] - lastPos[2];
// 如果有移动
if (dx != 0 || dy != 0 || dz != 0)
{
// 计算移动距离,用来近似移动的球面距离
d = Math.Sqrt(dx * dx + dy * dy + dz * dz);
// 通过移动距离计算移动的角度
theta = d * 180.0;
// 计算移动平面的法向量,即:lastPos × curPos
axis[0] = lastPos[1] * curPos[2] - lastPos[2] * curPos[1];
axis[1] = lastPos[2] * curPos[0] - lastPos[0] * curPos[2];
axis[2] = lastPos[0] * curPos[1] - lastPos[1] * curPos[0];
// 记录当前的鼠标单位半球面坐标
lastPos[0] = curPos[0];
lastPos[1] = curPos[1];
lastPos[2] = curPos[2];
// 重绘窗口
glDraw();
}
}
}
private void openGLControl1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
hemishere(e.X, e.Y, 500, lastPos);
}
}
private void glDraw()
{
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
gl.MatrixMode(OpenGL.MODELVIEW); // 设置当前使用模型视图矩阵栈
gl.LoadIdentity(); // Reset The View
gl.Translate(-1.5f, 0.0f, -6.0f); // Move Left And Into The Screen
// 计算新的旋转矩阵,即:M = E · R = R
gl.Rotate(theta, axis[0], axis[1], axis[2]);
//// 左乘上前一次的矩阵,即:M = R · L
gl.MultMatrix(lastMatrix);
//// 保存此次处理结果,即:L = M
gl.GetDouble(OpenGL.MODELVIEW_MATRIX, lastMatrix);
gl.Begin(OpenGL.TRIANGLES); // Start Drawing The Pyramid
gl.Color(1.0f, 0.0f, 0.0f); // Red
gl.Vertex(0.0f, 1.0f, 0.0f); // Top Of Triangle (Front)
gl.Color(0.0f, 1.0f, 0.0f); // Green
gl.Vertex(-1.0f, -1.0f, 1.0f); // Left Of Triangle (Front)
gl.Color(0.0f, 0.0f, 1.0f); // Blue
gl.Vertex(1.0f, -1.0f, 1.0f); // Right Of Triangle (Front)
gl.Color(1.0f, 0.0f, 0.0f); // Red
gl.Vertex(0.0f, 1.0f, 0.0f); // Top Of Triangle (Right)
gl.Color(0.0f, 0.0f, 1.0f); // Blue
gl.Vertex(1.0f, -1.0f, 1.0f); // Left Of Triangle (Right)
gl.Color(0.0f, 1.0f, 0.0f); // Green
gl.Vertex(1.0f, -1.0f, -1.0f); // Right Of Triangle (Right)
gl.Color(1.0f, 0.0f, 0.0f); // Red
gl.Vertex(0.0f, 1.0f, 0.0f); // Top Of Triangle (Back)
gl.Color(0.0f, 1.0f, 0.0f); // Green
gl.Vertex(1.0f, -1.0f, -1.0f); // Left Of Triangle (Back)
gl.Color(0.0f, 0.0f, 1.0f); // Blue
gl.Vertex(-1.0f, -1.0f, -1.0f); // Right Of Triangle (Back)
gl.Color(1.0f, 0.0f, 0.0f); // Red
gl.Vertex(0.0f, 1.0f, 0.0f); // Top Of Triangle (Left)
gl.Color(0.0f, 0.0f, 1.0f); // Blue
gl.Vertex(-1.0f, -1.0f, -1.0f); // Left Of Triangle (Left)
gl.Color(0.0f, 1.0f, 0.0f); // Green
gl.Vertex(-1.0f, -1.0f, 1.0f); // Right Of Triangle (Left)
gl.End();
}
相关推荐
C++游戏开发全流程:从架构设计到性能优化的工程实践
游戏开发的核心在于构建高效、稳定的实时交互系统,其底层原理涉及计算机图形学、内存管理与多线程并发。C++作为高性能系统编程语言,凭借其对硬件的直接控制能力和零成本抽象特性,在游戏引擎开发、图形渲染和性能关键模块中具有不可替代的技术价值。通过合理运用智能指针、ECS架构与数据驱动设计,开发者能够有效管理复杂游戏对象生命周期,实现缓存友好的数据访问模式,从而满足大型3A游戏对极致性能的需求。本文聚焦于C++游戏开发的具体实践,系统介绍了从工具链选型、核心模块实现到性能优化与多线程编程的完整工作流,为构建高性能游
用GPT-6从零开发三维CAD:技术选型、实操过程与工业软件护城河思考
三维CAD被誉为工业软件皇冠上的明珠,其核心挑战在于几何内核、渲染引擎和交互设计等数十年的技术沉淀。几何内核依赖NURBS曲面和BRep边界表示,处理布尔运算、容差等复杂数学逻辑;而Web端借助Three.js和WebGL,让浏览器内三维建模成为可能。随着GPT-6等大模型在工程代码生成上的突破,个人开发者能够利用AI辅助,结合开源几何内核OpenCascade.js,以前所未有的速度搭建功能原型。这种模式降低了三维CAD开发门槛,使快速验证、参数化建模和Web化协作成为现实应用场景。本文通过实际使用GPT
基于WinAPI与C++从零构建游戏SDK:深入理解Windows桌面程序开发
在桌面应用程序开发领域,理解操作系统底层交互机制是进阶高级开发者的关键。Windows API(WinAPI)作为Windows操作系统的核心编程接口,提供了对窗口管理、消息循环、图形绘制等基础功能的直接控制。通过封装WinAPI与C++标准库,开发者可以构建轻量级的应用框架,实现从概念到落地的工程实践。这种自研SDK的方式,不仅解决了对游戏引擎等高级框架“黑盒”操作的依赖问题,更能锻炼系统级的架构设计能力与模块化思维。其技术价值在于提供了高度可控、依赖极少的解决方案,尤其适合需要深入理解Windows消息
基于线性车辆三自由度动力学+无迹卡尔曼滤波UKF估计模型(横摆角速度+质心侧偏角+车速)联合仿真
内容概要:通过构建基于线性车辆三自由度动力学模型与无迹卡尔曼滤波(UKF)的联合仿真系统,实现对车辆关键状态参数的高精度估计,重点包括横摆角速度、质心侧偏角和车速。该方法利用车辆动力学模型描述其横向、纵向及横摆运动行为,结合UKF这一适用于非线性系统的先进状态估计算法,有效处理传感器噪声和模型不确定性,从而在缺乏直接测量手段的情况下,实现对难以获取状态量的可靠估计。整个仿真框架通常在MATLAB/Simulink环境中搭建,能够模拟真实驾驶工况,验证算法的有效性和鲁棒性,为车辆稳定性控制、自动驾驶感知与决策等高级功能提供重要的状态信息支撑。; 适合人群:具备车辆动力学、现代控制理论和MATLAB/Simulink仿真基础,从事汽车工程、自动驾驶或状态估计相关研究的研发人员与研究生。; 使用场景及目标:① 深入理解并掌握非线性系统状态估计的核心方法,特别是UKF的原理与实现;② 学习如何将理论化的车辆动力学模型转化为可用于仿真的模块;③ 实践并验证车辆关键状态(如质心侧偏角)的间接估计技术,服务于车辆动态控制系统的设计与测试。; 阅读建议:此资源以开发仿真模型为核心,不仅关注代码和模型的实现,更强调对车辆动力学机理和滤波算法设计思路的理解。学习者应结合理论知识,动手搭建并调试仿真模型,通过改变工况和参数来观察估计效果,从而深刻领会系统辨识与状态估计在实际工程中的应用价值。
基于PID控制的ABS汽车防抱死制动系统、车轮滑移率+最优滑移率Carsim和Simulink联合仿真(带参考文献)
内容概要:本文档主要围绕基于PID控制的汽车防抱死制动系统(ABS)开展研究,重点聚焦于车轮滑移率与最优滑移率的精确控制。通过Carsim与Simulink联合仿真平台,构建整车动力学模型与ABS控制器,利用PID算法实时调节制动压力,使实际滑移率逼近理论最优值,从而最大化轮胎与路面间的纵向附着力并保障横向稳定性,有效提升紧急制动工况下的制动效能与操控安全性。研究涵盖了从车辆建模、滑移率特性分析、PID控制器设计到联合仿真验证的全过程,并提供了完整的仿真模型、MATLAB/Simulink代码及参考文献,为相关领域的科研与工程实践提供了详实的技术参考。; 适合人群:具备车辆工程、自动化或控制理论基础知识,从事汽车电控系统开发、自动驾驶或车辆动力学仿真的研究生、工程师及科研人员。; 使用场景及目标:① 实现ABS系统的核心控制逻辑,掌握滑移率控制的关键技术;② 学习Carsim与Simulink联合仿真的搭建方法,进行车辆动力学与控制算法的协同仿真;③ 基于PID控制策略优化制动性能,完成相关学术研究或工程项目。; 阅读建议:在学习过程中,应结合所提供的完整仿真模型和代码,深入理解车辆动力学与ABS控制的交互机制,重点分析不同路面附着系数下最优滑移率的设定及PID参数的整定过程,以达到最佳的仿真效果和理论认知。


