关于OpenGL旋转和缩放的问题???

msgrev 2007-06-07 08:37:00
1. 开始我用glroate()来实现绕x,y的旋转,使用增加和减小z 来实现 缩放的功能,后来发现,当旋转后,坐标也跟随旋转,这样缩放有时候就变成平移。
所以现在我用glulookat 来做,利用改变视点的位置来实现,现在发现图象在旋转的过程跳来跳去,什么原因。

利用 glulookat 旋转时,向上的方向该怎么设置。

能不能推荐一个使用 glulookat 实现旋转和缩放的例子,用别的函数也可以,先谢谢了
...全文
3224 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
htzyhtzy 2008-09-19
  • 打赏
  • 举报
回复
另外上面有个人的说法有问题的。

缩放: glTranslatef( -eye.x, -eye.y, -eye.z);
glScalef( sx, sy, sz);
glTranslatef( eye.x, eye.y, eye.z);
其中,sx, sy, sz是放大倍数,eye同上
要想效率高些的话,用 glMultMatrix(m)
m自己算

我记得是宝典好象,已经明确的说了glMultMatrix(m)是用来实现你自己特殊的变换,其他时候最好不用它,它的效率比那3个标准转换函数要差, 所以效率高的说法应该是不妥的。但是他的代码是对的。

/*********************************************************************/
To emptyness:
我想你误会我的意思了
我是说一次glMultMatrix(m)的效率会比 glTranslatef( -eye.x, -eye.y, -eye.z);
glScalef( sx, sy, sz);
glTranslatef( eye.x, eye.y, eye.z);
这样三次函数调用的效率要高。




xintong8171 2007-07-20
  • 打赏
  • 举报
回复
对,在下次旋转之前,先将坐标还原至中心点
ciweiyu 2007-07-19
  • 打赏
  • 举报
回复
glMultMatrix(m)
关于m的计算,有个类CArcBall,可以通过鼠标拖动来实现旋转缩放,其中一个例子见:
http://blog.csdn.net/ciweiyu/archive/2007/07/13/1689806.aspx
其中的代码包含了旋转缩放功能
msgrev 2007-07-18
  • 打赏
  • 举报
回复
msgrev@126.com
emptyness 2007-07-17
  • 打赏
  • 举报
回复
由于openGL只有一个坐标系,所以平常画物体,
应该注意保存当前坐标系坐标,以便画完后返回。
glPushMatrix()
坐标变换。。。
画好物体A
glPopMatrix();
继续新的代码
这样画A就不会影响其他部分了。
gluLookat()的内部实现就是translatef和glRotatef()
另外上面有个人的说法有问题的。

缩放: glTranslatef( -eye.x, -eye.y, -eye.z);
glScalef( sx, sy, sz);
glTranslatef( eye.x, eye.y, eye.z);
其中,sx, sy, sz是放大倍数,eye同上
要想效率高些的话,用 glMultMatrix(m)
m自己算

我记得是宝典好象,已经明确的说了glMultMatrix(m)是用来实现你自己特殊的变换,其他时候最好不用它,它的效率比那3个标准转换函数要差, 所以效率高的说法应该是不妥的。但是他的代码是对的。

应该可以结帐了吧,
我不知道你是否的确需要缩放,如果你只需要象CS那样的控制
(glulookat()实现,VC6.0,C++,文件.h .cpp),可以留个邮件。
zanget 2007-07-14
  • 打赏
  • 举报
回复
本人写的C#代码片断,希望对你有帮助~
class _dView : OpenGLControl
{
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button== MouseButtons.Left)
{
xTransInit = e.X;
yTransInit = e.Y;
}
if (e.Button==MouseButtons.Right)
{
xRotAngInit = e.X;
yRotAngInit = e.Y;
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
xTrans += (e.X - xTransInit) / scale;
yTrans += (e.Y - yTransInit) / scale;
xTransInit = e.X;
yTransInit = e.Y;
this.Invalidate(); //调用glDraw()重绘window
}
if (e.Button == MouseButtons.Right)
{
xRotAng += (e.X - xRotAngInit);
yRotAng += (e.Y - yRotAngInit);
xRotAngInit = e.X;
yRotAngInit = e.Y;
this.Invalidate(); //调用glDraw()重绘window
}
}
protected override void OnMouseWheel(MouseEventArgs e)
{
zZoom +=e.Delta/scale;
this.Invalidate();
}
private double xTrans = 0; // X方向上的平移量
private double yTrans = 0; // Y方向上的平移量
private double xTransInit = 0; // X方向上的平移量
private double yTransInit = 0; // Y方向上的平移量

private double xRotAng = 0; // 角度
private double yRotAng = 0; // 角度
private double xRotAngInit = 0; // 角度
private double yRotAngInit = 0; // 角度

private double zZoom = -6.0d; // 相对屏幕视口(Z轴)移进移出



public override void glDraw()
{

GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清理窗口和缓存
GL.glLoadIdentity(); // 重新设置当前视口矩阵
double x = m_dXrange / (2 * scale);
double y = m_dYrange / (2 * scale);
double z = m_dZrange / (2 * scale);

GL.glTranslated(xTrans, 0.0d, 0.0d);
GL.glTranslated(0.0d, -yTrans, 0.0d);
GL.glTranslated(0.0d, 0.0d, zZoom);

//GL.glTranslated(xTrans, -yTrans, zZoom); // 作相应的平移
GL.glRotated(-xRotAng, 0.0d, yTrans, 0.0d); // 旋转x轴
GL.glRotated(-yRotAng, xTrans, 0.0d, 0.0d); // 旋转y轴

BuildBoundary(x,y,z); //绘制长方体的8条线
BuildAxisList(x,y,z); //绘制x,y,z轴 并且显示x,y,z提示
BuildDataList(); //绘制立方体内部
BuildWallList(); //绘制立方体表面

GL.glFlush(); //强制刷新
}
}
msgrev 2007-06-11
  • 打赏
  • 举报
回复
谢谢 htzyhtzy() 我试试
htzyhtzy 2007-06-08
  • 打赏
  • 举报
回复
缩放: glTranslatef( -eye.x, -eye.y, -eye.z);
glScalef( sx, sy, sz);
glTranslatef( eye.x, eye.y, eye.z);
其中,sx, sy, sz是放大倍数,eye同上
要想效率高些的话,用 glMultMatrix(m)
m自己算
htzyhtzy 2007-06-08
  • 打赏
  • 举报
回复
假设 glulookat(eye.x, eye.y, eye.z, center.x, center.y, center.z, up.x, up.y, up.z);
你想绕相应的 Z 转 angle 度,则 glRotated(angle, n.m_x, n.m_y, n.m_z),
其中 n = eye - center
绕其他轴类似。
msgrev 2007-06-08
  • 打赏
  • 举报
回复
to xlzxlich(阳光)

你给的网页中没有 缩放 旋转 的例子
freyam 2007-06-07
  • 打赏
  • 举报
回复
我也有相同的问题,高手呢?
xlzxlich 2007-06-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/xlzxlich/archive/2007/06/05/1639780.aspx
newcactus 2007-06-07
  • 打赏
  • 举报
回复
用glScalef来缩放。
旋转还是用glRotatef,不过要先用glTranslatef将物体移到原点,再用glRotatef,完了再用glTranslatef移回原来的位置。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧