社区
图形处理/算法
帖子详情
关于OpenGL旋转和缩放的问题???
msgrev
2007-06-07 08:37:00
1. 开始我用glroate()来实现绕x,y的旋转,使用增加和减小z 来实现 缩放的功能,后来发现,当旋转后,坐标也跟随旋转,这样缩放有时候就变成平移。
所以现在我用glulookat 来做,利用改变视点的位置来实现,现在发现图象在旋转的过程跳来跳去,什么原因。
利用 glulookat 旋转时,向上的方向该怎么设置。
能不能推荐一个使用 glulookat 实现旋转和缩放的例子,用别的函数也可以,先谢谢了
...全文
3224
13
打赏
收藏
关于OpenGL旋转和缩放的问题???
1. 开始我用glroate()来实现绕x,y的旋转,使用增加和减小z 来实现 缩放的功能,后来发现,当旋转后,坐标也跟随旋转,这样缩放有时候就变成平移。 所以现在我用glulookat 来做,利用改变视点的位置来实现,现在发现图象在旋转的过程跳来跳去,什么原因。 利用 glulookat 旋转时,向上的方向该怎么设置。 能不能推荐一个使用 glulookat 实现旋转和缩放的例子,用别的函数也可以,先谢谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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移回原来的位置。
OpenGL
程序平移、
旋转
、
缩放
变换_
OpenGL
程序平移、
旋转
、
缩放
变换_
理解掌握一个
OpenGL
程序平移、
旋转
、
缩放
变换的方法。
OpenGL
鼠标
旋转
缩放
及STL三维模型显示(源码)-C#
1. 鼠标显示STL三维模型; 2. 支持
旋转
、
缩放
和平移; 3. 该资源为源码,可先下载
OpenGL
鼠标
旋转
缩放
及STL三维模型显示(demo.exe)预览一下,是否符合自己的要求,然后再下载
【奇境】
OpenGL
计算机图形学编程—从小白到精通
1 课程简介: 本课程详细讲解了
OpenGL
从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越...
opengl
实现图形平移
旋转
缩放
华科图形学作业,
opengl
实现图形平移
旋转
缩放
OpenGl
旋转
缩放
框架.7z
使用Visual Studio基于C++的
OpenGl
旋转
缩放
框架,实现基本的
旋转
缩放
功能框架
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章