QT与OPENGL二:用鼠标控制lookat视角

这里写图片描述
这里写图片描述

但这个求坐标的x,y,z和lookat的右手坐标系不太一样,需要调换一下x,y,z顺序。
单独控制lookat的左右,和上下比较容易,合在一起遇到了些问题,主要是涉及到了球坐标。

当按下鼠标时记录当前点坐标。
mousePoint.push(mousePressPosition);
当移动鼠标时计算移动差
mouseCurPosition = QVector2D(e->localPos());
QVector2D offset;
if (mousePoint.size() == 1){
QVector2D mouseLastPosition = mousePoint.top();
offset = mouseCurPosition -mouseLastPosition ;
offset.setX(-offset.x());//由于方向问题,这里取反
}

每一次鼠标按下,都重新计算当前俯仰角
curPitch = 0;
curYaw = 0;
float camX = 0;
float camY = 0;
float camZ = 0;

//球坐标的计算,先计算球坐标夹角
curYaw = qAcos(offset.y()/5000 / radius );
curYaw = qRadiansToDegrees(curYaw);
//把求坐标的角度转换为笛卡尔坐标,即俯仰角
curYaw = 90 -curYaw;
//通过俯仰角计算偏航角
curPitch = qAsin(offset.x() / (radius * qCos(curYaw)) / 5000 );
curPitch = qRadiansToDegrees(curPitch);
//球坐标系中的x y z
camX = radius * qCos(lastYaw + curYaw)* qSin(lastPitch + curPitch) ;
camY = radius * qSin(lastYaw + curYaw);
camZ = radius * qCos(lastYaw + curYaw)* qCos(lastPitch + curPitch) ;
camPos.setX(camX);
camPos.setY(camY);
camPos.setZ(camZ);
当鼠标抬起,记录上一次俯角,仰角,一遍下一次顺畅使用
if (mousePoint.size() == 1)
mousePoint.pop();
lastPitch += curPitch;
lastYaw += curYaw;

lookat属性设置
QVector3D Pos(0, 0, 5); //pos
QVector3D Front(0, 0, 0); //target
QVector3D Up(0, 1, 0); //up direction
matrix.lookAt(camPos, camFront, camUp);

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆腐白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值