正交投影与gluLookAt一起使用?

时间:2022-01-26 04:55:24
想实现这样一个效果:多条直线,z坐标不同。想从多个角度来看这些线,但这些线不需要院校近大,所以采用了正交投影。
但是发现gluLookAt的效果很奇怪,是不是glOrtho不能和gluLookAt一起用呢?

#include <gl/glut.h>

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    //glRotatef(90, 0, 1, 0);
    gluLookAt(0,0,10, 5,0,1,0,1,0);

    glColor3f(1.0, 0,0);
    glBegin(GL_LINE_STRIP);
        glVertex3f(0, 5, 0);
        glVertex3f(5, 5, 0);
        glVertex3f(10, 5, 0);
    glEnd();

    glColor3f(0, 1, 0);
    glBegin(GL_LINE_STRIP);
        glVertex3f(0, 0, 1);
        glVertex3f(5, 5, 1);
        glVertex3f(10, 10, 1);
    glEnd();

    glColor3f(1, 1, 0);
    glBegin(GL_LINE_STRIP);
        glVertex3f(0, 0, 2);
        glVertex3f(5, 5, 2);
        glVertex3f(10, 0, 2);
    glEnd();

    glFlush();
}

void init(void)
{
    glClearColor(0, 0, 0, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 10, 0, 10, -10, 10);
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(300, 300);
    glutCreateWindow("hello");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

13 个解决方案

#1


1. 这两个函数可以一起用
2. 你没有说奇怪在哪里

#2


画一个x 0-10 y 0-10,z = 1,2,3的直线
别的代码都相同,只有这两处不同:
    glOrtho(-10, 20, -10, 20, -10, 50);

    gluPerspective(60, 1, 10, 50);
但是出来的效果很奇怪
尤其是glOrtho,如果glOrtho(0, 20, 0, 20, -10, 50);线只在左下角显示一半。
请问是为什么呢?
    gluLookAt(-10,5,3, 5,5, 2,0,1,0);

#3


glOrtho(-10, 20, -10, 20, -10, 50);

left right top down 这两组参数一般设为对称的,具体含义是当前视点为中心的上下左右边界距离

#4


你的意思是glOrtho的参数不是绝对坐标值?

#5


引用 4 楼 sigh02 的回复:
你的意思是glOrtho的参数不是绝对坐标值?


YES

Orthographic Projection
With an orthographic projection, the viewing volume is a rectangular parallelepiped, or more informally, a box (see Figure 3-13 ). Unlike perspective projection, the size of the viewing volume doesn't change from one end to the other, so distance from the camera doesn't affect how large an object appears. This type of projection is used for applications such as creating architectural blueprints and computer-aided design, where it's crucial to maintain the actual sizes of objects and angles between them as they're projected. 

正交投影与gluLookAt一起使用?

The command glOrtho() creates an orthographic parallel viewing volume. As with glFrustum(), you specify the corners of the near clipping plane and the distance to the far clipping plane. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Creates a matrix for an orthographic parallel viewing volume and multiplies the current matrix by it. The near clipping plane is a rectangle with the lower left corner at (left, bottom, -near) and the upper right corner at (right, top, -near). The far clipping plane is a rectangle with corners at (left, bottom, -far) and (right, top, -far). Both near and far can be positive or negative. 

#6


引用 5 楼 victor_woo 的回复:
Quote: 引用 4 楼 sigh02 的回复:

你的意思是glOrtho的参数不是绝对坐标值?


YES

Orthographic Projection
With an orthographic projection, the viewing volume is a rectangular parallelepiped, or more informally, a box (see Figure 3-13 ). Unlike perspective projection, the size of the viewing volume doesn't change from one end to the other, so distance from the camera doesn't affect how large an object appears. This type of projection is used for applications such as creating architectural blueprints and computer-aided design, where it's crucial to maintain the actual sizes of objects and angles between them as they're projected. 

正交投影与gluLookAt一起使用?

The command glOrtho() creates an orthographic parallel viewing volume. As with glFrustum(), you specify the corners of the near clipping plane and the distance to the far clipping plane. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Creates a matrix for an orthographic parallel viewing volume and multiplies the current matrix by it. The near clipping plane is a rectangle with the lower left corner at (left, bottom, -near) and the upper right corner at (right, top, -near). The far clipping plane is a rectangle with corners at (left, bottom, -far) and (right, top, -far). Both near and far can be positive or negative. 


我错了,这个上下左右是绝对坐标

#7


再次纠正:我自己写的正投影Camera中glOrtho个参数是相对于当前FOCUS和方向的上下左右相对距离,和窗口大小相关


void GCOrthoCamera::setProjectionAndView(int px,int py)
{
glMatrixMode(GL_PROJECTION);  
glLoadIdentity( );  
int viewport[] = {0, 0, m_nViewportWidth, m_nViewportHeight};

glOrtho(LBFINSTANCE->X(),RTNINSTANCE->X(),LBFINSTANCE->Y(),RTNINSTANCE->Y(),LBFINSTANCE->Z(),RTNINSTANCE->Z());

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();
    gluLookAt(POSITION->X(),POSITION->Y(),POSITION->Z()
             ,FOCUS->X(), FOCUS->Y(), FOCUS->Z()
             ,UP->X(), UP->Y(), UP->Z());
}

#8


我突然想明白一个问题,gOrtho的方向和gluLookAt是平行的。
原来我一直以为gOrtho的长方体是在坐标轴中的
哎!
但是(left, bottom,-near)和(right, top, -far)中的值都是相对于观察点吧?
如果我的观察点是(10, 10, 10),目标(10,10,0),那么gOrtho(-1,1,-1,1,-1,1)实际上看的就是坐标系中(9,9,9)和(11,11,11)之间的立方体吧?

#9


引用 8 楼 sigh02 的回复:
我突然想明白一个问题,gOrtho的方向和gluLookAt是平行的。
原来我一直以为gOrtho的长方体是在坐标轴中的
哎!
但是(left, bottom,-near)和(right, top, -far)中的值都是相对于观察点吧?
如果我的观察点是(10, 10, 10),目标(10,10,0),那么gOrtho(-1,1,-1,1,-1,1)实际上看的就是坐标系中(9,9,9)和(11,11,11)之间的立方体吧?


可以这么理解 gOrtho的视区形状确实和LookAt方向有关

个人认为显式调用gluLookAt使得场景构造更为清晰,将Camera和观察对象分离,在一个世界坐标系中明确出Camera和对象场景的位置关系(绝对和相对)

而不是含混的用一个gTranslate(0,0,5),即可表示相机向Z+移动5,又可理解为相机不动,物体Z-移动5,不好

#10


嗯,很有道理
不过确实跟书上说的感觉是绝对坐标不太匹配啊...

#11


引用 10 楼 sigh02 的回复:
嗯,很有道理
不过确实跟书上说的感觉是绝对坐标不太匹配啊...


大部分中文书都在扯淡

#12


哎。gluLookAt()作用MODELVIEW矩阵;
glOrtho()作用PROJECTION矩阵。
反过来用就不知道什么意义了。

#13


引用 12 楼 jiangcaiyang123 的回复:
哎。gluLookAt()作用MODELVIEW矩阵;
glOrtho()作用PROJECTION矩阵。
反过来用就不知道什么意义了。


1:3D物体摆放
2:摄像机位置方向定义
3:投影方式设置:正投影或者透视投影

代码顺序是3,2,1 但相关矩阵计算是栈的方式,先设置的矩阵在左

Mobj*Mcam*Mprj

#1


1. 这两个函数可以一起用
2. 你没有说奇怪在哪里

#2


画一个x 0-10 y 0-10,z = 1,2,3的直线
别的代码都相同,只有这两处不同:
    glOrtho(-10, 20, -10, 20, -10, 50);

    gluPerspective(60, 1, 10, 50);
但是出来的效果很奇怪
尤其是glOrtho,如果glOrtho(0, 20, 0, 20, -10, 50);线只在左下角显示一半。
请问是为什么呢?
    gluLookAt(-10,5,3, 5,5, 2,0,1,0);

#3


glOrtho(-10, 20, -10, 20, -10, 50);

left right top down 这两组参数一般设为对称的,具体含义是当前视点为中心的上下左右边界距离

#4


你的意思是glOrtho的参数不是绝对坐标值?

#5


引用 4 楼 sigh02 的回复:
你的意思是glOrtho的参数不是绝对坐标值?


YES

Orthographic Projection
With an orthographic projection, the viewing volume is a rectangular parallelepiped, or more informally, a box (see Figure 3-13 ). Unlike perspective projection, the size of the viewing volume doesn't change from one end to the other, so distance from the camera doesn't affect how large an object appears. This type of projection is used for applications such as creating architectural blueprints and computer-aided design, where it's crucial to maintain the actual sizes of objects and angles between them as they're projected. 

正交投影与gluLookAt一起使用?

The command glOrtho() creates an orthographic parallel viewing volume. As with glFrustum(), you specify the corners of the near clipping plane and the distance to the far clipping plane. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Creates a matrix for an orthographic parallel viewing volume and multiplies the current matrix by it. The near clipping plane is a rectangle with the lower left corner at (left, bottom, -near) and the upper right corner at (right, top, -near). The far clipping plane is a rectangle with corners at (left, bottom, -far) and (right, top, -far). Both near and far can be positive or negative. 

#6


引用 5 楼 victor_woo 的回复:
Quote: 引用 4 楼 sigh02 的回复:

你的意思是glOrtho的参数不是绝对坐标值?


YES

Orthographic Projection
With an orthographic projection, the viewing volume is a rectangular parallelepiped, or more informally, a box (see Figure 3-13 ). Unlike perspective projection, the size of the viewing volume doesn't change from one end to the other, so distance from the camera doesn't affect how large an object appears. This type of projection is used for applications such as creating architectural blueprints and computer-aided design, where it's crucial to maintain the actual sizes of objects and angles between them as they're projected. 

正交投影与gluLookAt一起使用?

The command glOrtho() creates an orthographic parallel viewing volume. As with glFrustum(), you specify the corners of the near clipping plane and the distance to the far clipping plane. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Creates a matrix for an orthographic parallel viewing volume and multiplies the current matrix by it. The near clipping plane is a rectangle with the lower left corner at (left, bottom, -near) and the upper right corner at (right, top, -near). The far clipping plane is a rectangle with corners at (left, bottom, -far) and (right, top, -far). Both near and far can be positive or negative. 


我错了,这个上下左右是绝对坐标

#7


再次纠正:我自己写的正投影Camera中glOrtho个参数是相对于当前FOCUS和方向的上下左右相对距离,和窗口大小相关


void GCOrthoCamera::setProjectionAndView(int px,int py)
{
glMatrixMode(GL_PROJECTION);  
glLoadIdentity( );  
int viewport[] = {0, 0, m_nViewportWidth, m_nViewportHeight};

glOrtho(LBFINSTANCE->X(),RTNINSTANCE->X(),LBFINSTANCE->Y(),RTNINSTANCE->Y(),LBFINSTANCE->Z(),RTNINSTANCE->Z());

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();
    gluLookAt(POSITION->X(),POSITION->Y(),POSITION->Z()
             ,FOCUS->X(), FOCUS->Y(), FOCUS->Z()
             ,UP->X(), UP->Y(), UP->Z());
}

#8


我突然想明白一个问题,gOrtho的方向和gluLookAt是平行的。
原来我一直以为gOrtho的长方体是在坐标轴中的
哎!
但是(left, bottom,-near)和(right, top, -far)中的值都是相对于观察点吧?
如果我的观察点是(10, 10, 10),目标(10,10,0),那么gOrtho(-1,1,-1,1,-1,1)实际上看的就是坐标系中(9,9,9)和(11,11,11)之间的立方体吧?

#9


引用 8 楼 sigh02 的回复:
我突然想明白一个问题,gOrtho的方向和gluLookAt是平行的。
原来我一直以为gOrtho的长方体是在坐标轴中的
哎!
但是(left, bottom,-near)和(right, top, -far)中的值都是相对于观察点吧?
如果我的观察点是(10, 10, 10),目标(10,10,0),那么gOrtho(-1,1,-1,1,-1,1)实际上看的就是坐标系中(9,9,9)和(11,11,11)之间的立方体吧?


可以这么理解 gOrtho的视区形状确实和LookAt方向有关

个人认为显式调用gluLookAt使得场景构造更为清晰,将Camera和观察对象分离,在一个世界坐标系中明确出Camera和对象场景的位置关系(绝对和相对)

而不是含混的用一个gTranslate(0,0,5),即可表示相机向Z+移动5,又可理解为相机不动,物体Z-移动5,不好

#10


嗯,很有道理
不过确实跟书上说的感觉是绝对坐标不太匹配啊...

#11


引用 10 楼 sigh02 的回复:
嗯,很有道理
不过确实跟书上说的感觉是绝对坐标不太匹配啊...


大部分中文书都在扯淡

#12


哎。gluLookAt()作用MODELVIEW矩阵;
glOrtho()作用PROJECTION矩阵。
反过来用就不知道什么意义了。

#13


引用 12 楼 jiangcaiyang123 的回复:
哎。gluLookAt()作用MODELVIEW矩阵;
glOrtho()作用PROJECTION矩阵。
反过来用就不知道什么意义了。


1:3D物体摆放
2:摄像机位置方向定义
3:投影方式设置:正投影或者透视投影

代码顺序是3,2,1 但相关矩阵计算是栈的方式,先设置的矩阵在左

Mobj*Mcam*Mprj