opengl - 立方体围绕球形接头旋转
问题描述
我的代码有问题。
//ball joint
glLoadIdentity();
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0);
glRotatef(viewangle, 0,1,0);
glTranslatef(2.5, .6, 0.0);
glPushMatrix();
gluSphere(quad,.25,15,15);
glPopMatrix();
//right arm
glLoadIdentity();
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0);
glRotatef(viewangle, 0,1,0);
glTranslatef(3.2, .55, 0.0);
glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);
glScalef(0.5,.12,0.1);
glPushMatrix();
drawBox();
glPopMatrix();
我试图让矩形围绕球形接头(其左侧)旋转,但它在其中心旋转。我认为问题在于上面的代码。
解决方案
球体位于 (2.5, 0.6):
glTranslatef(2.5, .6, 0.0);
该框位于 (3.2, 0.55):
glTranslatef(3.2, .55, 0.0);
球体的中心是支点。从枢轴到盒子原点的向量是:
(3.2, 0.55) - (2.5, 0.6) = (0.75, -0.05)
如果要围绕枢轴旋转对象,则必须:
以这种方式平移对象,即枢轴位于原点 (0, 0, 0)。这是从枢轴到盒子原点的向量 (0.75, -0.05)。
glTranslatef(0.75, -0.05f, 0.0f);
旋转对象。
glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);
以枢轴回到其原始位置的方式平移矩形。这是从枢轴到盒子原点的负向量 (-0.75, 0.05)。
glTranslatef(-0.7, 0.05f, 0.0f);
另请参阅如何在转换中使用枢轴点
由于操作类似于定义一个矩阵glTranslate
并将glRotate
当前矩阵与 nes 矩阵相乘,因此这些操作必须以相反的顺序进行。
//right arm
glLoadIdentity();
glTranslatef(0.0,0.0,-12.0);
glRotatef(tippangle, 1,0,0);
glRotatef(viewangle, 0,1,0);
glTranslatef(3.2, .55, 0.0);
glTranslatef(-0.7, 0.05f, 0.0f);
glRotatef((GLfloat)rightHandAngle, 0.0, 0.0, 1.0);
glTranslatef(0.75, -0.05f, 0.0f);
glScalef(0.5,.12,0.1);
drawBox();
另请参见 旋转前后的 OpenGL 平移。
推荐阅读
- bash - 如何在命令行上使用 MediaInfo 以 MBps 显示我的视频比特率 --Inform
- matrix - 如何使用 R 用随机数替换矩阵中的 NA?
- node.js - Node js、express 和 handlebars - 在渲染之前将逻辑应用于数据的位置
- java - 为什么阻塞依赖状态的操作比那些简单失败的操作更方便、更不容易出错?
- c# - 如何获取整数到数组(从整数 i 到整数 j)。C#
- postgresql - pg_dump 和 restore - pg_restore 在 Windows 上挂起
- javascript - JS - 为匹配 querySelectorAll 的所有元素添加点击事件监听器
- python - 在 Pandas Python 中基于列文本创建列
- python - python module speech_recognition recognized only first 5 seconds
- modulo - Understanding the modulo operation for negative integers