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

3D图形编程

开发平台:

Visual C++

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