Point3Df Scene :: GetCameraPosition() const { float cos_teta = cos( mCameraPosition.mTeta ); return Point3Df( cos_teta * sin( mCameraPosition.mAlpha ) * CAMERA_RADIUS, sin( mCameraPosition.mTeta ) * CAMERA_RADIUS, cos_teta * cos( mCameraPosition.mAlpha ) * CAMERA_RADIUS ); }
TriangView::TriangView(QWidget *parent): QGLWidget(parent), xRot(0), yRot(0), zRot(0), scale(.8) { #ifdef DRAW_CUBE /* Drawing a cube: * * 6-------7 diagonals: * /| /| * 4-------5 | z y 0-3 0-5 0-6 3-5 3-6 5-6 * | | | | | / * | 2-----|-3 | / * |/ |/ | / * 0-------1 |/______ x * */ for (unsigned i = 0; i < 8; ++i) { points.push_back(Point3Df( (i & 1) ? .5f : -.5f, (i & 2) ? .5f : -.5f, (i & 4) ? .5f : -.5f )); } triangles.push_back(Triangle3Df(0, 1, 3, 0.f, 0.f, -1.f)); triangles.push_back(Triangle3Df(0, 2, 3, 0.f, 0.f, -1.f)); triangles.push_back(Triangle3Df(0, 1, 5, 0.f, -1.f, 0.f)); triangles.push_back(Triangle3Df(0, 4, 5, 0.f, -1.f, 0.f)); triangles.push_back(Triangle3Df(0, 2, 6, -1.f, 0.f, 0.f)); triangles.push_back(Triangle3Df(0, 4, 6, -1.f, 0.f, 0.f)); triangles.push_back(Triangle3Df(3, 1, 5, 1.f, 0.f, 0.f)); triangles.push_back(Triangle3Df(3, 7, 5, 1.f, 0.f, 0.f)); triangles.push_back(Triangle3Df(3, 2, 6, 0.f, 1.f, 0.f)); triangles.push_back(Triangle3Df(3, 7, 6, 0.f, 1.f, 0.f)); triangles.push_back(Triangle3Df(5, 4, 6, 0.f, 0.f, 1.f)); triangles.push_back(Triangle3Df(5, 7, 6, 0.f, 0.f, 1.f)); #else fillVectors(points, triangles); #endif }
void Scene :: paintGL() { Point3Df camera_positon; Point3Df camera_directon; Point3Df right_vec_to_dir; camera_positon = GetCameraPosition(); camera_directon = Geometry :: Normalize( -1.0f * camera_positon ); camera_positon = camera_positon + mCameraShift; right_vec_to_dir = Geometry :: VectorMul( camera_directon, Point3Df( 0.0f, 1.0f, 0.0f ) ); glViewport( 0, 0, mWidth, mHeight ); if ( mIsStereo ) { right_vec_to_dir = ( mFrustumEyeSep / 2.0f ) * right_vec_to_dir; glMatrixMode( GL_PROJECTION ); glLoadIdentity(); mFrustumLeft = -mRatio * mFrustumHalfWidth - 0.5 * mFrustumEyeSep * mFrustumNearPlane / mFrustumFocalLength; mFrustumRight = mRatio * mFrustumHalfWidth - 0.5 * mFrustumEyeSep * mFrustumNearPlane / mFrustumFocalLength; glFrustum( mFrustumLeft, mFrustumRight, -mFrustumHalfWidth * mRatio, mFrustumHalfWidth * mRatio, mFrustumNearPlane, mFrustumFarPlane ); glMatrixMode( GL_MODELVIEW ); glDrawBuffer( GL_BACK_RIGHT ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); gluLookAt( camera_positon.mX + right_vec_to_dir.mX, camera_positon.mY + right_vec_to_dir.mY, camera_positon.mZ + right_vec_to_dir.mZ, camera_positon.mX + right_vec_to_dir.mX + camera_directon.mX, camera_positon.mY + right_vec_to_dir.mY + camera_directon.mY, camera_positon.mZ + right_vec_to_dir.mZ + camera_directon.mZ, 0, 1, 0 ); mpGame -> DrawWorld(); glLightfv( GL_LIGHT0, GL_POSITION, mpGame -> GetLightPosition() ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); mFrustumLeft = -mRatio * mFrustumHalfWidth + 0.5 * mFrustumEyeSep * mFrustumNearPlane / mFrustumFocalLength; mFrustumRight = mRatio * mFrustumHalfWidth + 0.5 * mFrustumEyeSep * mFrustumNearPlane / mFrustumFocalLength; glFrustum( mFrustumLeft, mFrustumRight, -mFrustumHalfWidth * mRatio, mFrustumHalfWidth * mRatio, mFrustumNearPlane, mFrustumFarPlane ); glMatrixMode( GL_MODELVIEW ); glDrawBuffer( GL_BACK_LEFT ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); gluLookAt( camera_positon.mX - right_vec_to_dir.mX, camera_positon.mY - right_vec_to_dir.mY, camera_positon.mZ - right_vec_to_dir.mZ, camera_positon.mX - right_vec_to_dir.mX + camera_directon.mX, camera_positon.mY - right_vec_to_dir.mY + camera_directon.mY, camera_positon.mZ - right_vec_to_dir.mZ + camera_directon.mZ, 0, 1, 0 ); mpGame -> DrawWorld(); glLightfv( GL_LIGHT0, GL_POSITION, mpGame -> GetLightPosition() ); } else { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho( -mWidth / 2, mWidth / 2, -mHeight / 2, mHeight / 2, 0, 1000 ); glMatrixMode( GL_MODELVIEW ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); gluLookAt( camera_positon.mX, camera_positon.mY, camera_positon.mZ, mCameraShift.mX, mCameraShift.mY, mCameraShift.mZ, 0, 1, 0 ); mpGame -> DrawWorld(); glLightfv( GL_LIGHT0, GL_POSITION, mpGame -> GetLightPosition() ); } DrawTextInformation(); swapBuffers(); }
bool Block :: PointIn( Point3Di aPoint ) { return PointIn( Point3Df( aPoint ) ); }
void Block :: Draw( Point3Df aFigPos ) { /* Вершины куба занумерованы в след. порядке( делим куб на 4 части ): 1)-,+,- 2)-,+,+ 3)+,+,+ 4)+,+,- 5)+,-,- 6)+,-,+ 7)-,-,+ 8)-,-,- */ glMaterialfv( GL_FRONT, GL_AMBIENT, mMaterial.GetMaterialForAmbient() ); glMaterialfv( GL_FRONT, GL_DIFFUSE, mMaterial.GetMaterialForDiffuse() ); glMaterialfv( GL_FRONT, GL_SPECULAR, mMaterial.GetMaterialForSpecular() ); //Firts side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 0 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 0 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 0 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 1 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 1 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 1 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 2 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 2 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 2 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 3 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 3 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 3 ].mZ ) ); //Second side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 1 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 1 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 1 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 6 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 6 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 6 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 5 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 5 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 5 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 2 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 2 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 2 ].mZ ) ); //Third side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 2 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 2 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 2 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 5 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 5 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 5 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 4 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 4 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 4 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 3 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 3 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 3 ].mZ ) ); //Fourth side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 6 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 6 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 6 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 7 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 7 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 7 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 4 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 4 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 4 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 5 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 5 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 5 ].mZ ) ); //Fifth side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 0 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 0 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 0 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 7 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 7 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 7 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 6 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 6 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 6 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 1 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 1 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 1 ].mZ ) ); //Sixth side DrawSide( Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 3 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 3 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 3 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 4 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 4 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 4 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 7 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 7 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 7 ].mZ ), Point3Df( aFigPos.mX + mPosF.mX + mVerticesF[ 0 ].mX, aFigPos.mY + mPosF.mY + mVerticesF[ 0 ].mY, aFigPos.mZ + mPosF.mZ + mVerticesF[ 0 ].mZ ) ); }
void Block :: Draw() { Draw( Point3Df( 0.0f, 0.0f, 0.0f ) ); }