资源简介
Qt Creator+opengl实现鼠标交互,控制模型任意旋转,实现轨迹球,
里面的void Widget::drawarrow(GLdouble x0, GLdouble y0, GLdouble z0, GLdouble x1, GLdouble y1, GLdouble z1)这个函数实现,空间任意两点绘制箭头的。
里面的void Widget::drawarrow(GLdouble x0, GLdouble y0, GLdouble z0, GLdouble x1, GLdouble y1, GLdouble z1)这个函数实现,空间任意两点绘制箭头的。
代码片段和文件信息
#include
#include “ArcBall.h“
//轨迹球参数:
//直径 2.0f
//半径 1.0f
//半径平方 1.0f
void ArcBall_t::_mapToSphere(const Point2fT* NewPt Vector3fT* NewVec) const
{
Point2fT TempPt;
GLfloat length;
//复制到临时变量
TempPt = *NewPt;
//把长宽调整到[-1 ... 1]区间
TempPt.s.X = (TempPt.s.X * this->AdjustWidth) - 1.0f;
TempPt.s.Y = 1.0f - (TempPt.s.Y * this->AdjustHeight);
//计算长度的平方
length = (TempPt.s.X * TempPt.s.X) + (TempPt.s.Y * TempPt.s.Y);
//如果点映射到球的外面
if (length > 1.0f)
{
GLfloat norm;
//缩放到球上
norm = 1.0f / FuncSqrt(length);
//设置z坐标为0
NewVec->s.X = TempPt.s.X * norm;
NewVec->s.Y = TempPt.s.Y * norm;
NewVec->s.Z = 0.0f;
}
//如果在球内
else
{
//利用半径的平方为1求出z坐标
NewVec->s.X = TempPt.s.X;
NewVec->s.Y = TempPt.s.Y;
NewVec->s.Z = FuncSqrt(1.0f - length);
}
}
ArcBall_t::ArcBall_t(GLfloat NewWidth GLfloat NewHeight)
{
this->StVec.s.X =0.0f;
this->StVec.s.Y = 0.0f;
this->StVec.s.Z = 0.0f;
this->EnVec.s.X =0.0f;
this->EnVec.s.Y = 0.0f;
this->EnVec.s.Z = 0.0f;
Matrix4fSetIdentity(&Transform);
Matrix3fSetIdentity(&LastRot);
Matrix3fSetIdentity(&ThisRot);
this->isDragging=false;
this->isClicked= false;
this->isRClicked = false;
this->isZooming = false;
this->zoomRate = 1;
this->setBounds(NewWidth NewHeight);
}
void ArcBall_t::upstate()
{
if(!this->isZooming && this->isRClicked){ // 开始拖动
this->isZooming = true; // 设置拖动为变量为true
this->LastPt = this->MousePt;
this->lastZoomRate = this->zoomRate;
}
else if(this->isZooming){//正在拖动
if(this->isRClicked){ //拖动
Point2fSub(&this->MousePt &this->LastPt);
this->zoomRate = this->lastZoomRate + this->MousePt.s.X * this->AdjustWidth * 2;
}
else{//停止拖动
this->isZooming = false;
}
}
else if (!this->isDragging && this->isClicked){ // 如果没有拖动
this->isDragging = true; // 设置拖动为变量为true
this->LastRot = this->ThisRot;
this->click(&this->MousePt);
}
else if(this->isDragging){
if (this->isClicked){ //如果按住拖动
Quat4fT ThisQuat;
this->drag(&this->MousePt &ThisQuat); // 更新轨迹球的变量
Matrix3fSetRotationFromQuat4f(&this->ThisRot &ThisQuat); // 计算旋转量
Matrix3fMulMatrix3f(&this->ThisRot &this->LastRot);
Matrix4fSetRotationFromMatrix3f(&this->Transform &this->ThisRot);
}
else // 如果放开鼠标,设置拖动为false
this->isDragging = false;
}
}
//按下鼠标记录当前对应的轨迹球的位置
void ArcBall_t::click(co
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4299 2014-03-13 11:14 guijiqiu\ArcBall.cpp
文件 12735 2014-03-13 11:08 guijiqiu\ArcBall.h
文件 387 2014-03-12 22:24 guijiqiu\guijiqiu.pro
文件 17903 2014-03-14 10:46 guijiqiu\guijiqiu.pro.user
文件 175 2014-03-12 22:22 guijiqiu\main.cpp
文件 6100 2014-03-14 10:46 guijiqiu\widget.cpp
文件 6062 2014-03-14 15:05 guijiqiu\widget.cpp.autosave
文件 546 2014-03-13 09:49 guijiqiu\widget.h
目录 0 2014-03-14 15:05 guijiqiu
----------- --------- ---------- ----- ----
48207 9
- 上一篇:一个人脸识别程序源码
- 下一篇:Y450 BIOS白名单
相关资源
- OpenGL文档,api大全,可直接查询函数
- opengl轮廓字体源代码
- MFC读三维模型obj文件
- 利用OpenGL写毛笔字算法
- MFC中OpenGL面和体的绘制以及动画效果
- 基于OPENGL的光线跟踪源代码368758
- VC 实现三维旋转(源码)
- 自编用openGL实现3D分形树,分形山
- OpenGL球形贴图自旋程序
- OpenGL导入贴图的Texture类
- 计算机图形学(openGL)代码
- 用OpenGL开发的机械臂运动仿真程序(
- OpenGL-3D坦克模拟
- 基于误差四元数的钻孔姿态跟踪控制
- OPENGL实现世界上最小的3D游戏
- 基于四元数的Chern–Simons理论在任
- VS2012OpenGL配置所需要的全部libdllh文件
- 基于OpenGL的仿蝗虫机器人三维动态仿
- 图形学 - OpenGL实现3种三维茶壶显示源
- opengl程序-会跳舞的骷髅
- opengl实现三维网格光顺Laplacian算法
- opengl——爆炸
- OpenGL三维地形建模
- opengl游戏编程徐明亮版(含源码)
- 用OPENGL画的一个简单的直升飞机
- opengl完美天空盒
- 3D绘图程序设计:使用Direct3D 10/9和Ope
- OpenGL绘制可运动自行车源程序.zip
- OpenGL实现飘动效果
- opengl室内场景的绘制,包括碰撞检测
评论
共有 条评论