求教:我想对模型进行旋转,旋转的中心是可以看到的部分的中心位置,这个位置我求对了,
可是旋转时有时不是围绕这个中心进行,请大家看看我写的代码有问题吗?
投影是正交投影:
glOrtho OrthoLeft, OrthoRight, OrthoBottom, OrthoTop, OrthoNear, OrthoFar
旋转代码:opermatrix是当前使用的矩阵,旋转前得到了旋转中心
Public Sub RotSceneOrtho(startp As POINTFLOAT, endp As POINTFLOAT)
If startp.X = endp.X And startp.Y = endp.Y Then Exit Sub
Dim vp(3) As Double
glGetDoublev glgViewport, vp(0)
startp.Y = vp(3) - startp.Y
endp.Y = vp(3) - endp.Y
Dim xaxis As New pVector, yaxis As New pVector, zaxis As New pVector
xaxis.SetVector OperMatrix(0), OperMatrix(4), OperMatrix(8)
yaxis.SetVector OperMatrix(1), OperMatrix(5), OperMatrix(9)
zaxis.SetVector OperMatrix(2), OperMatrix(6), OperMatrix(10)
xaxis.Unit
yaxis.Unit
zaxis.Unit
'旋转场景
glMatrixMode mmModelView
glTranslated RotCenter.X, RotCenter.Y, RotCenter.z
glRotatef 0.3 * (endp.X - startp.X), yaxis.X, yaxis.Y, yaxis.z
glRotatef -0.3 * (endp.Y - startp.Y), xaxis.X, xaxis.Y, xaxis.z
glTranslated -RotCenter.X, -RotCenter.Y, -RotCenter.z
glGetDoublev glgModelViewMatrix, OperMatrix(0)
End Sub
渲染时加载opermatrix
可是旋转时有时不是围绕这个中心进行,请大家看看我写的代码有问题吗?
投影是正交投影:
glOrtho OrthoLeft, OrthoRight, OrthoBottom, OrthoTop, OrthoNear, OrthoFar
旋转代码:opermatrix是当前使用的矩阵,旋转前得到了旋转中心
Public Sub RotSceneOrtho(startp As POINTFLOAT, endp As POINTFLOAT)
If startp.X = endp.X And startp.Y = endp.Y Then Exit Sub
Dim vp(3) As Double
glGetDoublev glgViewport, vp(0)
startp.Y = vp(3) - startp.Y
endp.Y = vp(3) - endp.Y
Dim xaxis As New pVector, yaxis As New pVector, zaxis As New pVector
xaxis.SetVector OperMatrix(0), OperMatrix(4), OperMatrix(8)
yaxis.SetVector OperMatrix(1), OperMatrix(5), OperMatrix(9)
zaxis.SetVector OperMatrix(2), OperMatrix(6), OperMatrix(10)
xaxis.Unit
yaxis.Unit
zaxis.Unit
'旋转场景
glMatrixMode mmModelView
glTranslated RotCenter.X, RotCenter.Y, RotCenter.z
glRotatef 0.3 * (endp.X - startp.X), yaxis.X, yaxis.Y, yaxis.z
glRotatef -0.3 * (endp.Y - startp.Y), xaxis.X, xaxis.Y, xaxis.z
glTranslated -RotCenter.X, -RotCenter.Y, -RotCenter.z
glGetDoublev glgModelViewMatrix, OperMatrix(0)
End Sub
渲染时加载opermatrix
解决方案 »
- 界面中年月日的编写问题
- 请大家给我一个WriteFile,ReadFile的使用范例!!!!!急用!!!!!!!!!!!!
- 如何调用ATL COM工程生成的DLL中的方法?谢谢任何形式的帮助!
- 怎样在对话框里加菜单?
- 请问CFrameWnd里哪个函数和CDialog里的OnInitDialog?
- 怎样列举出安装的所有打印机和其相关信息:状态,类型,位置?
- 关于内联函数
- 80年干了10年C++,突然迷上linux,求出路啊
- 我的朋友问了我一个很什么的问题?
- unsigned char[]数组转换 const char* 的问题
- 请问如何在父对话框上生成子对话框
- 有什么好的适合调试并发服务器的方法
大概看了一下,应该是旋转前后没有保存和恢复状态,你需要Pushmatrix然后在旋转后再Popmatrix,不然位移和旋转后会改变当前矩阵,造成矩阵中心的改变。vb好久没用了,不知道对应的函数是不是也是这两个
glPushMatrix();渲染结束增加:
glPopMatrix();保证上一次渲染操作不影响当前渲染的模型视图矩阵。
glClear clrColorBufferBit Or clrDepthBufferBit
glMatrixMode mmModelView
glLoadMatrixd OperMatrix(0)
dt3.Render3Dt
SwapBuffers ghDC
非常感谢大家的回答,我这样加载矩阵,应该不会受上次渲染的影响吧,我试着加上glPushMatrix(); glPopMatrix(); 效果也一样呀