gluLookAt函数实现键盘控制浏览原点半径10行星球体的参数设置
你可以通过维护两个角度变量+球面坐标转换的方式计算eye坐标,up向量在普通场景下直接用(0,1,0)即可满足行星观察的需求,具体实现方案如下:
1. 维护全局状态变量
需要定义3个可修改的全局变量控制视角:
view_distance:观察点到球心的距离,因为行星半径为10单位,建议设为15.0(留出足够空间观察完整行星)yaw:水平方位角,控制360度水平旋转,单位为角度,初始值设为0.0pitch:俯仰角,控制上下视角调整,单位为角度,初始值设为0.0,后续需要限制在-85° ~ 85°区间避免视角翻转
2. 计算eye坐标
通过球面坐标公式将角度转换为三维空间的eye坐标,需要先把角度转为弧度:
// 角度转弧度 float yaw_rad = yaw * M_PI / 180.0f; float pitch_rad = pitch * M_PI / 180.0f; GLdouble eyeX = view_distance * cos(pitch_rad) * sin(yaw_rad); GLdouble eyeY = view_distance * sin(pitch_rad); GLdouble eyeZ = view_distance * cos(pitch_rad) * cos(yaw_rad);
3. up向量取值
常规行星观察场景下,只要俯仰角不超过±85度,直接使用(0.0, 1.0, 0.0)作为up向量即可,不会出现显示异常。如果需要支持超过90度的俯仰且不出现视角翻转,可以通过视线向量叉乘计算正交up向量,普通场景无需额外处理。
4. 键盘控制逻辑
监听键盘按键修改角度变量即可实现视角调整:
// 示例按键处理,每次调整2度,可自行修改数值控制灵敏度 if(按下左方向键) yaw -= 2.0; if(按下右方向键) yaw += 2.0; if(按下上方向键) pitch += 2.0; if(按下下方向键) pitch -= 2.0; // 俯仰角限幅,防止视角颠倒 if(pitch > 85.0) pitch = 85.0; if(pitch < -85.0) pitch = -85.0; // 方位角自动循环,避免数值溢出 if(yaw > 360.0) yaw -= 360.0; if(yaw < 0.0) yaw += 360.0;
5. 最终gluLookAt调用
gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, // 你已确定的球心坐标 0.0, 1.0, 0.0);
内容的提问来源于stack exchange,提问作者kaelyn loh
相关产品推荐
相关产品推荐

