perspective_view3.cpp
上传用户:btjssb159
上传日期:2022-07-13
资源大小:107k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include "Gut.h"
  3. #include "Vector4.h"
  4. #include <d3dx9.h>
  5. #include <GL/glu.h>
  6. void RenderFrameDX9(void);
  7. void RenderFrameOpenGL(void);
  8. void main(int argc, char *argv[])
  9. {
  10. // 默认使用DirectX 9来绘图
  11. char *device = "dx9";
  12. if ( argc > 1 )
  13. {
  14. // 如果命令行参数指定用OpenGL, 就改用OpenGL.
  15. if ( stricmp(argv[1], "opengl")==0 )
  16. {
  17. device = "opengl";
  18. }
  19. }
  20. // 在(100,100)的位置打开一个大小为(512x512)的窗口
  21. GutCreateWindow(100, 100, 512, 512, device);
  22. // 做OpenGL或DirectX初始化
  23. if ( !GutInitGraphicsDevice(device) )
  24. {
  25. printf("Failed to initialize %s devicen", device);
  26. exit(0);
  27. }
  28. // 主循环
  29. while( GutProcessMessage() )
  30. {
  31. if ( !strcmp(device, "dx9") )
  32. {
  33. RenderFrameDX9();
  34. }
  35. else
  36. {
  37. RenderFrameOpenGL();
  38. }
  39. }
  40. // 关闭OpenGL/DirectX绘图设备
  41. GutReleaseGraphicsDevice();
  42. }
  43. // 金字塔形的8条边线
  44. Vector4 g_vertices[] = 
  45. {
  46. Vector4(-1.0f, 1.0f,-1.0f),
  47. Vector4(-1.0f,-1.0f,-1.0f),
  48. Vector4(-1.0f,-1.0f,-1.0f),
  49. Vector4( 1.0f,-1.0f,-1.0f),
  50. Vector4( 1.0f,-1.0f,-1.0f),
  51. Vector4( 1.0f, 1.0f,-1.0f),
  52. Vector4( 1.0f, 1.0f,-1.0f),
  53. Vector4(-1.0f, 1.0f,-1.0f),
  54. Vector4( 0.0f, 0.0f, 1.0f),
  55. Vector4(-1.0f, 1.0f,-1.0f),
  56. Vector4( 0.0f, 0.0f, 1.0f),
  57. Vector4(-1.0f,-1.0f,-1.0f),
  58. Vector4( 0.0f, 0.0f, 1.0f),
  59. Vector4( 1.0f,-1.0f,-1.0f),
  60. Vector4( 0.0f, 0.0f, 1.0f),
  61. Vector4( 1.0f, 1.0f,-1.0f),
  62. };
  63. // 镜头位置
  64. Vector4 g_eye(0.0f,3.0f,3.0f); 
  65. // 镜头对准的点
  66. Vector4 g_lookat(0.0f, 0.0f, 0.0f); 
  67. // 镜头正上方的方向
  68. Vector4 g_up(0.0f, -1.0f, 1.0f); 
  69. // `使用DirectX9来绘图`
  70. void RenderFrameDX9(void)
  71. {
  72. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  73.     device->SetRenderState( D3DRS_LIGHTING, FALSE );
  74.     device->Clear(
  75. 0, NULL, // `清除整个画面` 
  76. D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, // `清除颜色和Z Buffer` 
  77. D3DCOLOR_ARGB(0, 0, 0, 0), // `设置要把颜色清成黑色`
  78. 1.0f, // `设置要把Z值清为1, 也就是离镜头最远.`
  79. 0 // `设置要把Stencil buffer清为0, 在这是否设置没有区别.`
  80. );
  81. // `计算出一个可以转换到镜头坐标系的矩阵`
  82. D3DXVECTOR3 eye(0.0f, 3.0f, 3.0f);
  83. D3DXVECTOR3 lookat(0.0f, 0.0f, 0.0f);
  84. D3DXVECTOR3 up(0.0f, -1.0f, 1.0f);
  85. // `计算镜头转换矩阵`
  86. D3DXMATRIX view_matrix;
  87. D3DXMatrixLookAtRH(&view_matrix, &eye, &lookat, &up);
  88. // `设置镜头转换矩阵`
  89. device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix); 
  90. // `计算透视投影矩阵`
  91. D3DXMATRIX perspective_matrix;
  92. D3DXMatrixPerspectiveFovRH(&perspective_matrix, FastMath::DegreeToRadian(90.0f), 1.0f, 1.0f, 100.0f);
  93. // `设置视角转换矩阵`
  94. device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *)&perspective_matrix); 
  95. device->BeginScene(); // `开始下绘图指令`
  96. device->SetFVF(D3DFVF_XYZ); // `设置数据格式`
  97. // `画出金字塔的8条边线`
  98. device->DrawPrimitiveUP(D3DPT_LINELIST, 8, g_vertices, sizeof(Vector4)); 
  99. device->EndScene(); // `声明所有的绘图指令都下完了`
  100. // `把背景backbuffer的画面显示出来`
  101.     device->Present( NULL, NULL, NULL, NULL );
  102. }
  103. // `使用OpenGL来绘图`
  104. void RenderFrameOpenGL(void)
  105. {
  106. // `清除画面`
  107. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  108. // `计算并设置镜头转换矩阵`
  109. glMatrixMode(GL_MODELVIEW);
  110. glLoadIdentity();
  111. gluLookAt(
  112. g_eye[0], g_eye[1], g_eye[2],
  113. g_lookat[0], g_lookat[1], g_lookat[2],
  114. g_up[0], g_up[1], g_up[2]);
  115. // `计算并设置视角转换矩阵`
  116. glMatrixMode(GL_PROJECTION);
  117. glLoadIdentity();
  118. gluPerspective(90.0f, 1.0f, 1.0f, 100.0f);
  119. // `画出金字塔的8条边线`
  120. glEnableClientState(GL_VERTEX_ARRAY);
  121. glVertexPointer(4, GL_FLOAT, sizeof(Vector4), g_vertices);
  122. glDrawArrays(GL_LINES, 0, 16);
  123. // `把背景backbuffer的画面显示出来`
  124. GutSwapBuffersOpenGL();
  125. }