Почему у оси Y не работает ссылка на кадр SuperBible или GluLookAt - PullRequest
1 голос
/ 07 апреля 2011

В настоящее время я пытаюсь понять, как использовать класс GLFrame в превосходной книге, и согласно 4-му изданию книги матрица камеры, полученная из класса Frame of reference, должна работать так же, как GluLookAt

Когда я добавляю эти строки

cameraFrame.SetForwardVector(-0.5f, 0.0f,-0.5f);
cameraFrame.Normalize();

Камера смотрит в правильном направлении, рыскание на 45 градусов (правильно ли я делаю!)

Однако, когда я добавлю это

cameraFrame.SetForwardVector(0.0f, 0.5f,-0.5f);

Камера выглядит так, как если бы она была установлена ​​на (0,0f, 0,0f, 1,0f)

Почему это так? Это сводит меня с ума уже три дня. Может быть, я неправильно передаю векторы, но я не уверен, как пройти в x, y 360 градусов для просмотра (вперед) местоположения / вектора. Нужно ли нормализовать векторы перед их передачей?

В конце концов, я надеюсь полностью вывести мышью (стиль FPS), но сейчас просто понять, почему я не могу заставить камеру просто наклонить камеру, было бы хорошим началом.

Thansk!

Вот код на месте.

// Called to draw scene
void RenderScene(void)
{
// Color values
static GLfloat vFloorColor[] = { 0.0f, 1.0f, 0.0f, 1.0f};
static GLfloat vTorusColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
static GLfloat vSphereColor[] = { 0.0f, 0.0f, 1.0f, 1.0f };

// Time Based animation
static CStopWatch   rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;

// Clear the color and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


// Save the current modelview matrix (the identity matrix)
modelViewMatrix.PushMatrix();   

M3DMatrix44f mCamera;

/////////
///////// My Code

cameraFrame.SetForwardVector(-0.5f,-0.5f,-0.5f);
cameraFrame.Normalize();

///////// End of my code
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.PushMatrix(mCamera);

// Transform the light position into eye coordinates
M3DVector4f vLightPos = { 0.0f, 10.0f, 5.0f, 1.0f };
M3DVector4f vLightEyePos;
m3dTransformVector4(vLightEyePos, vLightPos, mCamera);

// Draw the ground
shaderManager.UseStockShader(GLT_SHADER_FLAT,
                             transformPipeline.GetModelViewProjectionMatrix(),
                             vFloorColor);  
floorBatch.Draw();

for(int i = 0; i < NUM_SPHERES; i++) {
    modelViewMatrix.PushMatrix();
    modelViewMatrix.MultMatrix(spheres[i]);
    shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,     transformPipeline.GetModelViewMatrix(), 
                            transformPipeline.GetProjectionMatrix(), vLightEyePos, vSphereColor);
    sphereBatch.Draw();
    modelViewMatrix.PopMatrix();
    }

// Draw the spinning Torus
modelViewMatrix.Translate(0.0f, 0.0f, -2.5f);

// Save the Translation
modelViewMatrix.PushMatrix();

    // Apply a rotation and draw the torus
    modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);
    shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), 
                                 transformPipeline.GetProjectionMatrix(), vLightEyePos, vTorusColor);
    torusBatch.Draw();
modelViewMatrix.PopMatrix(); // "Erase" the Rotation from before

// Apply another rotation, followed by a translation, then draw the sphere
modelViewMatrix.Rotate(yRot * -2.0f, 0.0f, 1.0f, 0.0f);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), 
                            transformPipeline.GetProjectionMatrix(), vLightEyePos, vSphereColor);
sphereBatch.Draw();

// Restore the previous modleview matrix (the identity matrix)
modelViewMatrix.PopMatrix();
modelViewMatrix.PopMatrix();    
// Do the buffer Swap
glutSwapBuffers();

// Tell GLUT to do it again
glutPostRedisplay();
* *} Тысяча двадцать-один

1 Ответ

0 голосов
/ 05 июня 2011

Спасибо за ответы на все, но у меня была проблема.В супербибле openGL я использовал их встроенный эталонный класс, и у меня была проблема с двумя функциями, одна из которых называлась rotate и rotateWorld.

Мне нужно было использовать rotate для перемещения вверх / вниз,и вращайте мир для движения влево и вправо.Это заставило камеру вести себя правильно (fly camera).

Это имеет смысл, так как независимо от того, куда вы смотрите вверх / вниз, вы хотите, чтобы весь мир всегда вращался вокруг вертикальной оси.Уф!

...