void cameraInitialize(GLCamera *theCam, WindowPtr winPtr) { Rect winPort; GLdouble viewparms[] = {-0.5, 0.5, // Left Right -0.5, 0.5, // Bottom Top 0.5, 100.0}; // zNear zFar GLdouble *viewVol = theCam->viewVolume; GetWindowBounds(winPtr, kWindowContentRgn, &winPort); theCam->w = winPort.right - winPort.left; theCam->h = winPort.bottom - winPort.top; theCam->aspectRatio = theCam->h / theCam->w; theCam->fov = 3.141517/2; // pi/2 theCam->hFrac = tan(theCam->fov * 0.5); theCam->vFrac = tan(theCam->fov * 0.5 * theCam->aspectRatio); glViewport(0, 0, (GLsizei) theCam->w, (GLsizei) theCam->h); cameraSetViewParameters(theCam, viewparms); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); cameraMove(theCam, 0.0, 0.0, -4.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); #if 1 //USE_PERSPECTIVE glFrustum(viewVol[0], viewVol[1], viewVol[2], viewVol[3], viewVol[4], viewVol[5]); #else glOrtho(viewVol[0], viewVol[1], viewVol[2], viewVol[3], viewVol[4], viewVol[5]); #endif glMatrixMode(GL_MODELVIEW); }
int main (int argc, char **argv) { if( Import3DS(myModel, argv[1]) == false ){ // printf("Error: import 3ds file failed"); // exit(0); inputModel = false; } glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(600, 600); glutInitWindowPosition(100, 70); glutCreateWindow("Model Viewer (Lighting & texture mapping) Bo CHEN"); DrawInit(); init(); cameraMove(); glutDisplayFunc(DisplayFunc); glutIdleFunc(IdleFunc); glutKeyboardFunc(keyboard); /* set keyboard handler */ glutSpecialFunc(ProcessArrowKey); glutMouseFunc(ProcessMouse); glutMotionFunc(ProcessMouseMotion); glutMainLoop(); return 0; }
void IIRenderWindow::keyPressEvent(QKeyEvent * event) { switch(event->key()) { case Qt::Key_W: { mTranslateVector.z=-1; break; } case Qt::Key_S: { mTranslateVector.z=1; break; } case Qt::Key_A: { mTranslateVector.x=-1; break; } case Qt::Key_D: { mTranslateVector.x=1; break; } case Qt::Key_Q: { mTranslateVector.y=1; break; } case Qt::Key_E: { mTranslateVector.y=-1; break; } case Qt::Key_H: { mCamera->setPosition( 40, 300, 580 ); break; } } QString x; x.setNum(mCamera->getPosition().x); QString y; y.setNum(mCamera->getPosition().y); QString z; z.setNum(mCamera->getPosition().z); mCameraLable->setText("Camera:"+x+","+y+","+z); emit cameraMove(mCamera->getPosition().x,mCamera->getPosition().y,mCamera->getPosition().z); }
static void CG_DemosUpdatePlayer( void ) { demo.oldcmd = demo.cmd; trap_GetUserCmd( trap_GetCurrentCmdNumber(), &demo.cmd ); demoMoveUpdateAngles(); demoMoveDeltaCmd(); if ( demo.seekEnabled ) { int delta; demo.play.fraction -= demo.serverDeltaTime * 1000 * demo.cmdDeltaAngles[YAW]; delta = (int)demo.play.fraction; demo.play.time += delta; demo.play.fraction -= delta; if (demo.deltaRight) { int interval = mov_seekInterval.value * 1000; int rem = demo.play.time % interval; if (demo.deltaRight > 0) { demo.play.time += interval - rem; } else { demo.play.time -= interval + rem; } demo.play.fraction = 0; } if (demo.play.fraction < 0) { demo.play.fraction += 1; demo.play.time -= 1; } if (demo.play.time < 0) { demo.play.time = demo.play.fraction = 0; } return; } switch ( demo.editType ) { case editCamera: cameraMove(); break; case editChase: demoMoveChase(); break; case editDof: dofMove(); break; case editEffect: demoEffectMove(); break; case editLine: demoMoveLine(); break; } }
void loop() { while(action!='s'){while(getChar(action));}; //confirm here while(1){ if(getChar(action)){ if(action=='a')cameraMove(0,1); if(action=='d')cameraMove(0,-1); if(action=='w')cameraMove(1,0); if(action=='x')cameraMove(-1,0); if(action=='q')cameraMove(1,1); if(action=='e')cameraMove(1,-1); if(action=='z')cameraMove(-1,1); if(action=='c')cameraMove(-1,-1); } } //confirm here }
// // Callbacks // void DisplayFunc() { /* Implement zoom in and out with mose right button is pressed */ if( (zoomIn == true) && (cameraZoom > 50) ){ cameraZoom--; zoomIn = false; glPushMatrix(); // To preserve the matrix of rotation init(); cameraMove(); glPopMatrix(); } if( (zoomOut == true) && (cameraZoom < 180) ){ cameraZoom++; zoomOut = false; glPushMatrix(); init(); cameraMove(); glPushMatrix(); } /* Implement camera rotation */ if( (leftButton == true) ){ if( leftRotation == true ){ cameraPosX += 0.08; } if( rightRotation == true){ cameraPosX -= 0.08; } if( upRotation == true){ cameraPosY += 0.08; } if( downRotation == true){ cameraPosY -= 0.08; } init(); cameraMove(); cameraRotate = false; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glMatrixMode(GL_MODELVIEW); // glMatrixMode(GL_PROJECTION); // glLoadIdentity(); DisplayAxes(); // glPopMatrix(); glPushMatrix(); /* rotate around x or y axis when arrow key is pressed */ if( rotateLeftX == true){ // glPopMatrix(); // glPushMatrix(); // glMatrixMode(GL_MODELVIEW); // glRotatef( 9.0f, 1.0f, 0.0f, 0.0f ); // DrawScene(); // glPopMatrix(); // glMatrixMode(GL_MODELVIEW); // glPushMatrix(); rotateX = rotateX + 9.0; rotateLeftX = false; } if( rotateRightX == true){ rotateX = rotateX - 9.0; rotateRightX = false; } if( rotateUpY == true){ rotateY = rotateY + 9.0; rotateUpY = false; } if( rotateDownY == true){ rotateY = rotateY - 9.0; rotateDownY = false; } glRotatef(rotateX, 1.0f, 0.0f, 0.0f ); glRotatef(rotateY, 0.0f, 1.0f, 0.0f); DrawScene(); glPopMatrix(); glutSwapBuffers(); }
void GameScene::initGame() { blockVertexShader=new QGLShader(QGLShader::Vertex); blockVertexShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/block.vsh")); blockFragmentShader=new QGLShader(QGLShader::Fragment); blockFragmentShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/block.fsh")); blockProgram=new QGLShaderProgram; blockProgram->addShader(blockVertexShader); blockProgram->addShader(blockFragmentShader); if(!blockProgram->link()){ qWarning("Failed to compile and link shader program"); qWarning("Vertex shader log:"); qWarning() << blockVertexShader->log(); qWarning() << blockFragmentShader->log(); qWarning("Shader program log:"); qWarning() << blockProgram->log(); QMessageBox::warning(0,tr("错误"),tr("着色器程序加载失败造成游戏无法正常启动\n" "请联系开发者寻求解决方案"),QMessageBox::Ok); exit(1); } lineVertexShader=new QGLShader(QGLShader::Vertex); lineVertexShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/line.vsh")); lineFragmentShader=new QGLShader(QGLShader::Fragment); lineFragmentShader->compileSourceFile(QLatin1String(":/res/divinecraft/shader/line.fsh")); lineProgram=new QGLShaderProgram; lineProgram->addShader(lineVertexShader); lineProgram->addShader(lineFragmentShader); if(!lineProgram->link()){ qWarning("Failed to compile and link shader program"); qWarning("Vertex shader log:"); qWarning() << lineVertexShader->log(); qWarning() << lineFragmentShader->log(); qWarning("Shader program log:"); qWarning() << lineProgram->log(); QMessageBox::warning(0,tr("错误"),tr("着色器程序加载失败造成游戏无法正常启动\n" "请联系开发者寻求解决方案"),QMessageBox::Ok); exit(1); } //////////////////////////// camera=new Camera(QVector3D(0,4,0),QPointF(180.0,0.0)); world=new World; wThread=new QThread; world->moveToThread(wThread); connect(wThread,SIGNAL(finished()),world,SLOT(deleteLater())); //线程被销毁的同时销毁world connect(this,SIGNAL(reloadWorld()),world,SLOT(forcedUpdateWorld())); //强制进行世界刷新 connect(camera,SIGNAL(cameraMove(QVector3D)),world,SLOT(changeCameraPosition(QVector3D))); //连接camera移动与世界相机位移的槽 connect(this,SIGNAL(resetRenderLen()),world,SLOT(updateWorld())); connect(this,SIGNAL(addBlock()),camera,SLOT(addBlock())); connect(this,SIGNAL(removeBlock()),camera,SLOT(removeBlock())); connect(world,SIGNAL(loadOver()),this,SLOT(loadOverSlot())); wThread->start(); // world->setMaxRenderLen(maxRenderLen); world->setWorldName("new_world"); camera->setWorld(world); //传递世界指针 /////////////////////////// //这里是一个规定的加载顺序,后步骤会依赖于前步骤 world->loadBlockIndex(); //加载方块属性列表 loadTexture(); //加载纹理 //====================== line=new LineMesh(2); //十字准心 float lineLen=0.0004; line->addLine(QVector3D(-lineLen,0,-0.02),QVector3D(lineLen,0,-0.02)); line->addLine(QVector3D(0,-lineLen,-0.02),QVector3D(0,lineLen,-0.02)); lineQua=new LineMesh(12); //被选方块的包围线框 //======================= //数据面板 dataPanel=new DataPanel(0,0,200,100); addItem(dataPanel); glFps=0; drawCount=0; dataPanel->setRenderLen(maxRenderLen); connect(camera,SIGNAL(getPositions(QVector3D,QVector3D)),this,SLOT(dataShowPosition(QVector3D,QVector3D))); // dataPanel->hide(); //背包物品栏 backPackBar=new BackPackBar(this); hideBackPackBar(); backPackBar->setWorld(world); //传递world指针 //物品栏 itemBar=new ItemBar(this); connect(itemBar,SIGNAL(thingIndexChange(int)),camera,SLOT(setBlockId(int))); backPackBar->setPocket(itemBar); //======================= //消息面板 messagePanel=new MessagePanel; addItem(messagePanel); //=========================== //选项菜单 opWidget=new OptionsWidget(); opWidgetProxy=new QGraphicsProxyWidget(0); opWidgetProxy->setWidget(opWidget); this->addItem(opWidgetProxy); opWidgetProxy->hide(); inOpWidget=false; connect(opWidget,SIGNAL(continueGame()),this,SLOT(continueGame())); connect(opWidget,SIGNAL(mouseLevelValueChange(int)),camera,SLOT(setMouseLevel(int))); connect(opWidget,SIGNAL(renderValueChange(int)),this,SLOT(setRenderLen(int))); connect(opWidget,SIGNAL(quitClick()),gView,SLOT(close())); //============================= loadSettings(); camera->loadPosRot(); //加载位置视角信息 setRenderLen(maxRenderLen); //设置渲染距离并刷新整个世界 opWidget->setRenderLen(maxRenderLen); opWidget->setMouseLevel(camera->getMouseLevel()); }
static int demoSetupView( void) { vec3_t forward; int inwater = qfalse; qboolean behindView = qfalse; int contents; cg.playerPredicted = qfalse; cg.playerCent = 0; demo.viewFocus = 0; demo.viewTarget = -1; switch (demo.viewType) { case viewChase: if ( demo.chase.cent && demo.chase.distance < mov_chaseRange.value ) { centity_t *cent = demo.chase.cent; if ( cent->currentState.number < MAX_CLIENTS ) { cg.playerCent = cent; cg.playerPredicted = cent == &cg.predictedPlayerEntity; if (!cg.playerPredicted ) { //Make sure lerporigin of playercent is val CG_CalcEntityLerpPositions( cg.playerCent ); } cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0); CG_CalcViewValues(); // first person blend blobs, done after AnglesToAxis if ( !cg.renderingThirdPerson ) { CG_DamageBlendBlob(); } VectorCopy( cg.refdef.vieworg, demo.viewOrigin ); VectorCopy( cg.refdefViewAngles, demo.viewAngles ); } else { VectorCopy( cent->lerpOrigin, demo.viewOrigin ); VectorCopy( cent->lerpAngles, demo.viewAngles ); } demo.viewFov = cg_fov.value; } else { memset( &cg.refdef, 0, sizeof(refdef_t)); AngleVectors( demo.chase.angles, forward, 0, 0 ); VectorMA( demo.chase.origin , -demo.chase.distance, forward, demo.viewOrigin ); VectorCopy( demo.chase.angles, demo.viewAngles ); demo.viewFov = cg_fov.value; demo.viewTarget = demo.chase.target; cg.renderingThirdPerson = qtrue; } break; case viewCamera: memset( &cg.refdef, 0, sizeof(refdef_t)); VectorCopy( demo.camera.origin, demo.viewOrigin ); VectorCopy( demo.camera.angles, demo.viewAngles ); demo.viewFov = demo.camera.fov + cg_fov.value; demo.viewTarget = demo.camera.target; cg.renderingThirdPerson = qtrue; cameraMove(); break; case viewEffect: memset( &cg.refdef, 0, sizeof(refdef_t)); if ( demo.effect.active ) { VectorCopy( demo.effect.active->origin, demo.viewOrigin ); VectorCopy( demo.effect.active->angles, demo.viewAngles ); demo.viewAngles[ROLL] = 0; demo.viewFov = cg_fov.value; cg.renderingThirdPerson = qtrue; } break; default: return inwater; } demo.viewAngles[YAW] += mov_deltaYaw.value; demo.viewAngles[PITCH] += mov_deltaPitch.value; demo.viewAngles[ROLL] += mov_deltaRoll.value; trap_FX_VibrateView( 1.0f, demo.viewOrigin, demo.viewAngles ); VectorCopy( demo.viewOrigin, cg.refdef.vieworg ); AnglesToAxis( demo.viewAngles, cg.refdef.viewaxis ); /* find focus ditance to certain target but don't apply if dof is not locked, use for drawing */ if ( demo.dof.target >= 0 ) { centity_t* targetCent = demoTargetEntity( demo.dof.target ); if ( targetCent ) { vec3_t targetOrigin; chaseEntityOrigin( targetCent, targetOrigin ); //Find distance betwene plane of camera and this target demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg ); demo.dof.focus = demo.viewFocusOld = demo.viewFocus; } else { demo.dof.focus = demo.viewFocus = demo.viewFocusOld; } if (demo.dof.focus < 0.001f) { behindView = qtrue; } } if ( demo.dof.locked ) { if (!behindView) { demo.viewFocus = demo.dof.focus; demo.viewRadius = demo.dof.radius; } else { demo.viewFocus = 0.002f; // no matter what value, just not less or equal zero demo.viewRadius = 0.0f; } } else if ( demo.viewTarget >= 0 ) { centity_t* targetCent = demoTargetEntity( demo.viewTarget ); if ( targetCent ) { vec3_t targetOrigin; chaseEntityOrigin( targetCent, targetOrigin ); //Find distance betwene plane of camera and this target demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg ); demo.viewRadius = CG_Cvar_Get( "mme_dofRadius" ); } } else if ( demo.dof.target >= 0 ) { demo.viewFocus = 0; demo.viewRadius = 0; } cg.refdef.width = cgs.glconfig.vidWidth*cg_viewsize.integer/100; cg.refdef.width &= ~1; cg.refdef.height = cgs.glconfig.vidHeight*cg_viewsize.integer/100; cg.refdef.height &= ~1; cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2; cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2; cg.refdef.fov_x = demo.viewFov; cg.refdef.fov_y = atan2( cg.refdef.height, (cg.refdef.width / tan( demo.viewFov / 360 * M_PI )) ) * 360 / M_PI; contents = CG_PointContents( cg.refdef.vieworg, -1 ); if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){ double v = WAVE_AMPLITUDE * sin(((double)cg.time + (double)cg.timeFraction) / 1000.0 * WAVE_FREQUENCY * M_PI * 2); cg.refdef.fov_x += v; cg.refdef.fov_y -= v; inwater = qtrue; } else { inwater = qfalse; } return inwater; }