剪切和投影如何在简化的解释中工作?它与标准化顶点和矩阵乘法有关,包括将x,y,z除以第四个变量.我无法理解实际发生的事情.
我试图在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) 我在OpenGL中遇到问题让我的对象(一个行星)相对于当前的相机旋转旋转.它似乎首先工作,但在旋转一点后,旋转不再正确/相对于相机.
我正在计算屏幕上mouseX和mouseY移动的增量(差异).旋转存储在称为"planetRotation"的Vector3D中.
这是我的代码来计算相对于planetRotation的旋转:
Vector3D rotateAmount;
rotateAmount.x = deltaY;
rotateAmount.y = deltaX;
rotateAmount.z = 0.0;
glPushMatrix();
glLoadIdentity();
glRotatef(-planetRotation.z, 0.0, 0.0, 1.0);
glRotatef(-planetRotation.y, 0.0, 1.0, 0.0);
glRotatef(-planetRotation.x, 1.0, 0.0, 0.0);
GLfloat rotMatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix);
glPopMatrix();
Vector3D transformedRot = vectorMultiplyWithMatrix(rotateAmount, rotMatrix);
planetRotation = vectorAdd(planetRotation, transformedRot);
Run Code Online (Sandbox Code Playgroud)
理论上 - 它的作用是在'rotateAmount'变量中设置一个旋转.然后通过将此向量与逆模型变换矩阵(rotMatrix)相乘,将其转换为模型空间.
然后将该变换后的旋转添加到当前旋转.
要渲染这是正在设置的转换:
glPushMatrix();
glRotatef(planetRotation.x, 1.0, 0.0, 0.0);
glRotatef(planetRotation.y, 0.0, 1.0, 0.0);
glRotatef(planetRotation.z, 0.0, 0.0, 1.0);
//render stuff here
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开启或关闭?
我正在尝试编写一些代码,将纹理渲染到一个简单的方块上,但是在使它工作时遇到了很多麻烦.我在这里下载了一些用于纹理映射的示例源代码并编译它,它似乎在它们的柱面上做了很好的纹理映射.然后,我添加了一些我的代码,看看它是否会将纹理渲染到我的方块上,但它只是用纯色绘制它,它似乎是红色和黑色之间的中间,而不是像圆柱体上出现的棋盘格.这是我在第一遍调用gluCylinder后添加的代码:
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(-1, -1);
glTexCoord2f(1,0);
glVertex2f(1, -1);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glTexCoord2f(0,1);
glVertex2f(-1, 1);
glEnd();
Run Code Online (Sandbox Code Playgroud)
是否有任何理由为什么纹理会在圆柱体上正常渲染而不是在我的四边形上?
在OpenGL 2.1中,我将位置和法线向量传递给我的顶点着色器.然后顶点着色器将a varying设置为法线向量,因此理论上它是对每个三角形的法线进行线性插值.(据我所知,这是Phong着色的基础.)
在片段着色器中,我使用法线和Lambert定律来计算漫反射.这可以按预期工作,除了顶点之间的插值看起来很有趣.具体来说,我看到了一个星暴影响,其中沿顶点之间的边缘有明显的"热点".
这是一个例子,不是来自我自己的渲染,而是展示完全相同的效果(请参见页面中间的黄金球):http: //pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php ?N = CPSC453W11.Lab12
维基百科说这是Gauraud阴影的一个问题.但正如我所理解的那样,通过插入法线并运行每个片段的光照计算,我使用的是Phong模型,而不是Gouraud.是对的吗?
如果我使用更精细的网格,我认为这些星暴会更不明显.但是添加更多三角形是解决这个问题的唯一方法吗?我认为有一种方法可以在没有爆炸效果的情况下进行平滑插值.(我确实在其他地方的粗糙网格物体上看到了非常平滑的阴影,例如在3D Studio Max中.但也许他们正在做一些比插入法线更复杂的东西.)
我需要能够拉伸我在整个2d或3d(面部)形状上导入的图像纹理.它只会在形状的右上角渲染,并且重复 - 如果我启用GL_REPEAT,或者如果我启用GL_CLAMP,图像将从突出到边缘的边伸展.
这是我的代码:
#include "stdafx.h"
#include "glut.h"
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
GLuint texture;
float xRotation = 0.0f;
void drawScene1 (void) {
//glRotatef(xRotation,0.0f,1.0f,0.0f);
glBindTexture(GL_TEXTURE_2D, texture);
//glutSolidCube(1.0f);
glBegin(GL_POLYGON);
glTexCoord2d(0,1);
glVertex2d(-1.5,-1.5);
glTexCoord2d(1,1);
glVertex2d(1.0,-2.0);
glTexCoord2d(1,0);
glVertex2d(+1.5,+1.5);
glTexCoord2d(0,0);
glVertex2d(-1.5,+1.5);
glEnd();
}
void FreeTexture(GLuint texture) {
glDeleteTextures(1, &texture);
}
GLuint LoadTexture(const char * filename, int width, int height) {
GLuint texture;
unsigned char * data;
FILE * file;
file = fopen(filename, "rb");
if ( file == NULL ) return 0;
data = (unsigned …Run Code Online (Sandbox Code Playgroud) 我在gtk绘图区域小部件中使用OpenGL绘制一个立方体.现在我想将"clicked"等事件附加到多维数据集,以便可以选择拖放等等.我该怎么办?
我正在使用OpenNi,NITE和OpenGL在Visual Studio 2008中创建一个kinect项目.
在随机时间dureing开发我收到以下错误:
从"C:\ Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe"返回错误结果1.
我没有运气在网上搜索过.
我能够创建一个新项目并复制我的所有代码并且它工作正常但这不是我想要每天做多次的事情.
如果需要更多信息,我很乐意给予它.
编辑完整输出窗口读取
1>------ Build started: Project: PointViewer, Configuration: Debug Win32 ------
1>Compiling resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>fatal error RC1110: could not open ..\Res\NITE.rc
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe'.
1>Build log was saved at "file://d:\Documents\Uni work\Year 4\Personal Project\Samples \PointViewer\Debug\BuildLog.htm"
1>PointViewer - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将包含X,Y和Z坐标(类型为float)的数组传递给函数glTranslatef(),但是我不知道实现此目的的方法。
作为我要完成的事情的一个例子;
float xyz[3] = {3,2,1};
glTranslatef(xyz);
Run Code Online (Sandbox Code Playgroud)
每当我尝试这样的事情时,我都会收到以下错误
无法将参数'1'的'float *'转换为'GLfloat {aka float}'转换为'void glTranslatef(GLfloat,GLfloat,GLfloat)'
我已经尝试在整个Google上进行搜索,但是找不到我想要的东西。