如题,目前我用欧拉角做旋转是以原点为中心而不是以屏幕中心点为中心。而且平移摄像机的话旋转也会出问题。
6条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在OpenGL中,为了让摄像机绕着屏幕中心旋转,你需要明确地定义摄像机的位置坐标,并将其绑定到显存中的数据结构上。这个过程通常被称为“摄像机绑定”。
以下是一个基本的实现步骤:
-
创建一个二维数组,表示摄像机的所有观察点。每个观察点是一个
GL/glMatrix4f
对象,其中包含矩阵参数。 -
设置摄像机的第一个观察点为屏幕中心(0, 0)。
-
在循环中,获取当前帧的时间戳和从屏幕左上角(向下)看去的角度。这可以通过
glLookAt()
函数完成。 -
将当前视角相对于屏幕视角进行变换,同时将新的视角存储在摄像机的位置变量中。
-
使用
glRotatef()
函数对摄像机进行旋转。 -
重复上述步骤,直到摄像机位置不再改变。
下面是一个简单的C++代码示例,展示了如何实现上述功能:
#include <GL/glut.h> // 实现摄像机绑定 void Camera绑定(const float* viewPos, const float* camPos) { // 创建一个二维数组来存储摄像机所有观察点 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 创建一个新的`GL/glMatrix4f`对象来表示摄像机的所有观察点 GLdouble rotation[9]; glLoadMatrixf(GL接种Matrix4f::translate); // 设置摄像机的第一个观察点为屏幕中心 GLdouble translation[2] = {0, 0}; glMultivectorf(rotation, 1, translation, viewPos[0], viewPos[1]); glMultivectorf(camPos, 1, translation, camPos[0], camPos[1]); // 对摄像机进行旋转 glRotatef(1, 1, 1, -cos(0.0)); } int main(int argc, char** argv) { glutInit(&argc, argv); glutCreateWindow("Camera Animation"); // 连接多个显示器 glutSwapBuffers(); while (true) { // 获取当前帧的时间戳 double timestamp = glutGetTime(); // 计算从屏幕左上角看去的角度 float screenSizeX = 800; float screenSizeY = 600; float x = screenSizeX / 2.0; float y = screenSizeY / 2.0; float angle = atan2(y, x); // 更新摄像机的位置并执行旋转操作 Camera绑定(screenSizeX * angle, viewBox[0] + x, viewBox[1] + y); } return 0; }
注意:以上代码仅作为一个基本示例,实际使用时可能需要根据具体需求对其进行调整。例如,你可能需要处理不同的摄像机角度、视口大小、显示器间距等问题。此外,这个例子中的
glEnable()
和glDisable()
函数并没有被包含在main()
函数中,因为在大多数现代 OpenGL 环境中,这些函数已经被弃用,你可以使用glClear()
和glDepthRange()
函数来替代它们。解决 无用评论 打赏 举报 编辑记录-
悬赏问题
- ¥15 Android Navigation: 某XDirections类不能自动生成
- ¥20 C#上传XML格式数据
- ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
- ¥100 单片机hardfaulr
- ¥20 手机截图相片分辨率降低一半
- ¥50 求一段sql语句,遇到小难题了,可以50米解决
- ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
- ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
- ¥15 虚拟机检测,可以是封装好的DLL,可付费
- ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)