我有一个VECTOR结构,它包含3个整数,i,j和k.我需要在多个头文件中使用此结构.将所有#defines和结构,所有常量移动到标记为"Constants.h"的单独头文件,或者我应该在每个头文件中定义相同的结构(我当前使用它)被认为是不好的做法吗?
假设我有以下代码:
glRotatef(angle, 1.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(0.0f, 0.0f -5.0f);
Run Code Online (Sandbox Code Playgroud)
这是否比通过glLoadMatrix函数使用自己的自定义矩阵效率更低,它可以实现相同的功能?
此外,我知道当将矩阵相乘以形成自定义线性变换时,最后一个矩阵乘以是第一个发生的变换.同样,如果我使用上面的代码就是这种情况?它是否会平移,然后围绕Z轴旋转,然后绕y轴和x轴旋转?
我正在尝试创建一个自定义 GLWindow 类,其中包括我对 OpenGL 窗口的所有设置。但是,我还想在我的 GLWindow 类中包含发送到窗口的消息的 WndProc 回调函数。
GLWindow.h:
class GLWindow
{
private:
HWND hWnd;
HDC hDC;
HGLRC hRC;
public:
GLWindow();
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
bool Create();
~GLWindow();
}
GLWindow.cpp:
GLWindow::GLWindow()
{
}
bool GLWindow::Create(int width, int height, char * title, bool fullscreen)
{
WNDCLASSEX window;
HINSTANCE hInstance;
hInstance = GetModuleHandle(NULL);
window.cbSize = sizeof(WNDCLASSEX);
window.cbClsExtra = 0;
window.cbWndExtra = 0;
window.hbrBackground = NULL;
window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
window.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
window.hCursor = …Run Code Online (Sandbox Code Playgroud) 我试图在XZ平面上反射一个旋转的立方体(所以最终这是一个3D到2D的投影).但是,我的立方体投影到XZ平面上的点重叠,正如预期的那样,由于立方体是3D并且存在具有相同X值但具有不同y值的点(将2个点投影到同一点上) ).
我的问题是,如何只投影我想要投射到的平面上可见的立方体上的点?
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
glTranslatef(0.0f, 0.0f, -5.0f);
GLfloat matrix[16] = {1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0};
glPushMatrix();
glRotatef(angle, 1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
DrawCube();
glEnd();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0f, -1.0f, 0.0f);
glMultMatrixf(matrix);
glRotatef(angle, 1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
DrawCube();
glEnd();
glPopMatrix();
Run Code Online (Sandbox Code Playgroud) 我注意到当我渲染一个简单的图元时,就像旋转的立方体一样,我将每个角度增加0.1,然后通过传统的while(!done)循环,这是我在垂直同步开启时的结果与关闭时的结果(如在我的nVidia控制面板中改变了)在速度方面有很大的不同.
例如,我使用以下代码:
while (!done)
{
PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT)
{
done = true;
}
else
{
angle += 0.1;
if (angle >= 360.0)
{
angle = 0.0;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glPushMatrix();
glRotatef(angle, 1.0f, 0.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidCube(2.0f);
glPopMatrix();
glFlush();
SwapBuffers(hDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Run Code Online (Sandbox Code Playgroud)
当强制关闭垂直同步时,此立方体旋转的速度比强制垂直同步时快得多.现在,在游戏中,当启用垂直同步时,FPS锁定为60 fps,并且当禁用时,可以自由跳转到显示器允许的最高值.这可能与它有关.
我可以通过每次传递增加或减少我的角度来轻松解决这个问题,有没有办法让我的立方体以相同的方式旋转,尽管vsync开启或关闭?