opengl大侠请进:几个红宝书相关的问题

hkjhaha 2008-09-08 10:26:12
最近,学习opengl, 课本:opengl红宝书;
有两个问题比较疑惑:
1、按照红宝书上说:opengl坐标系的z正向指向屏幕外,实际代码测试,发现z指向屏幕里面,这是怎么回事?
2、glOrtho()函数如下设置以后,视线的方向是从(0.0, 0.0f, 0.0f)看向Z正向,还是Z负向?
3、如果下面代码,glOrtho的最后两个参数near, far的正负交换一下,这时候,视线的方向是从(0.0, 0.0f, 0.0f)看向Z正向,还是Z负向?此时会不会影响到glRotatef旋转方向(实际代码测试,好像是有影响的)?

GLfloat nRange = 100.0;

w = ClientWidth;
h = ClientHeight;

if(h == 0)
h = 1;

glViewport(0, 0, w, h);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);


glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

...全文
116 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkjhaha 2008-09-11
  • 打赏
  • 举报
回复
贴个代码,bcb的,不过很好改成vc的,好像旋转方向不对啊!



TForm1 *Form1;
HGLRC g_hrc = NULL;
HDC g_hdc = NULL;
int g_iFontList = 0;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = IdleLoop;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdleLoop(TObject*, bool& done)
{
//TODO: Add your source code here
done = false;

RenderScene ();

SwapBuffers (g_hdc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
g_hdc = GetDC (Handle);

SetDCPixelFormat (g_hdc);

g_hrc = wglCreateContext (g_hdc);

wglMakeCurrent (g_hdc, g_hrc);

SetRC (g_hdc);
}
//---------------------------------------------------------------------------
// 设置pixel格式
void __fastcall TForm1::SetDCPixelFormat(HDC hdc)
{
//TODO: Add your source code here
int iPixelFormat;

PIXELFORMATDESCRIPTOR pfd = {
sizeof (pfd),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0, 0,
0, 0, 0, 0, 0,
16,
0,
0,
0,
0,
0,
0,
0};

iPixelFormat = ChoosePixelFormat (g_hdc, &pfd);

SetPixelFormat (g_hdc, iPixelFormat, &pfd);
}
// -----------------------------------------------------------------------
void __fastcall TForm1::SetRC(HDC hdc)
{
//TODO: Add your source code here
HFONT hFont;

GLYPHMETRICSFLOAT agmf[128];

LOGFONT logfont;

logfont.lfHeight = -10;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = FW_BOLD;
logfont.lfItalic = FALSE;
logfont.lfUnderline = FALSE;
logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = ANSI_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily = DEFAULT_PITCH;
lstrcpy (logfont.lfFaceName, "Arial");

hFont = CreateFontIndirect (&logfont);

SelectObject (g_hdc, hFont);


g_iFontList = glGenLists (128);
wglUseFontOutlines (g_hdc, 0, 128, g_iFontList, 0.0f, 0.5f,
WGL_FONT_POLYGONS, agmf);
DeleteObject (hFont);

glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
glColor3f (0.0f, 1.0f, 0.0f);

glEnable (GL_DEPTH_TEST);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
wglMakeCurrent (g_hdc, NULL);

wglDeleteContext (g_hrc);

ReleaseDC (Handle, g_hdc);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormResize(TObject *Sender)
{
ChangeSize (ClientWidth, ClientHeight);
}
#define ORTHO 0
void __fastcall TForm1::ChangeSize(int w, int h)
{
GLfloat nRange = 100.0;

w = ClientWidth;
h = ClientHeight;

if(h == 0)
h = 1;

glViewport(0, 0, w, h);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();

#if ORTHO
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

#else
//For perspective correction
GLfloat aspect = (GLfloat)w/(GLfloat)h;
gluPerspective(60.0f, aspect, 1.0, 400.0);
#endif


glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glFlush();
}
#define PI 3.1415f
GLfloat xRot = 0.0f, yRot = 0.0f;
#include "math.h"
#include "stdio.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::RenderScene (void)
{

//TODO: Add your source code here
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLfloat x, y, z, angle;

glPushMatrix ();
#if (ORTHO == 0)
glTranslatef (0.0f, 0.0f, -200.0f);
#endif
glRotatef (xRot, 1.0f, 0.0f, 0.0f);
glRotatef (yRot, 0.0f, 1.0f, 0.0f);

glBegin (GL_LINES);
glVertex3f (0.0f, 0.0f, -50.0f);
glVertex3f (50.0f, 0.0f, -50.0f);
glEnd ();

glBegin (GL_LINE_STRIP);
z = -50.0f;
GLfloat adi = 0.01f;
for (angle = 0.0f; angle <= (2.0f * PI) * 3.0f; angle += 0.1f)
{
x = 50.0f * sin(angle);
y = 50.0f * cos(angle);

glVertex3f (x, y, z);

z += 0.5f;

}
glEnd ();

glPopMatrix ();

char cBuff[200];
sprintf (cBuff, "xRot:%f yRot:%f", xRot, yRot);
Caption = cBuff;
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (Key == VK_UP)
{
xRot += 1.0f;
}
else if (Key == VK_DOWN)
{
xRot -= 1.0f;
}
else if (Key == VK_LEFT)
{
yRot += 1.0f;
}
else if (Key == VK_RIGHT)
{
yRot -= 1.0f;
}
}
sanshao27 2008-09-11
  • 打赏
  • 举报
回复
帮忙顶
giant1st 2008-09-11
  • 打赏
  • 举报
回复
3楼的回答是正解!
请楼主注意: glMatrixMode(GL_MODELVIEW);后
MODELVIEW矩阵 是由模型 和 视点的相对变换来决定的,例如后移模型,就是前移 视点,估计你的方向弄反了与这有关!
另一个 关于变换 易犯得错误是:包括旋转,平移在内的操作是 相对于局部坐标 还是全局坐标进行的!
yale13 2008-09-10
  • 打赏
  • 举报
回复
解答:
1.z正向指向屏幕外
2.此时视线指向z负向
3.交换之后指向z正向,会影响方向,因为屏幕上显示的是你看到的,你反着去看一个东西旋转,当然不一样了~
至于你的所谓测试,不知道你是怎么测试的,而且可能如2l所说,你做坐标旋转了吧?
dtor 2008-09-10
  • 打赏
  • 举报
回复
帮顶
jinjazz 2008-09-10
  • 打赏
  • 举报
回复
右手系,z指向你
VsirSoft 2008-09-10
  • 打赏
  • 举报
回复
OPENGL HOHO 算法
wohaoku 2008-09-10
  • 打赏
  • 举报
回复
只能支持了,看不懂了。
xsc2001 2008-09-08
  • 打赏
  • 举报
回复
你对坐标系进行旋转了吧?

19,468

社区成员

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

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