orthogonal_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,0.0f,5.0f); 
  63. // `镜头对准的点`
  64. Vector4 g_lookat(0.0f, 0.0f, 0.0f); 
  65. // `镜头正上方的方向`
  66. Vector4 g_up(0.0f, 1.0f,0.0f); 
  67. // `使用DirectX9来绘图`
  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 orthogonal_matrix = GutMatrixOrthoRH_DirectX(5.0f, 5.0f, 0.1f, 100.0f);
  83. // `把这两个矩阵相乘`
  84. Matrix4x4 view_orthogonal_matrix = view_matrix * orthogonal_matrix;
  85. // `把空间中的坐标点转换到屏幕坐标系上`
  86. Vector4 vertices[16];
  87. for ( int i=0; i<16; i++ )
  88. {
  89. vertices[i] = g_vertices[i] * view_orthogonal_matrix;
  90. vertices[i] /= vertices[i].GetW();
  91. }
  92. device->BeginScene(); // `开始下绘图指令`
  93. device->SetFVF(D3DFVF_XYZ); // `设置数据格式`
  94. // `画出金字塔的8条边线`
  95. device->DrawPrimitiveUP(D3DPT_LINELIST, 8, vertices, sizeof(Vector4)); 
  96. device->EndScene(); // `声明所有的绘图指令都下完了`
  97. // `把背景backbuffer的画面显示出来`
  98.     device->Present( NULL, NULL, NULL, NULL );
  99. }
  100. // `使用OpenGL来绘图`
  101. void RenderFrameOpenGL(void)
  102. {
  103. // `清除画面`
  104. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  105. // `计算出一个可以转换到镜头坐标系的矩阵`
  106. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  107. // `计算出一个使用正交投影的矩阵`
  108. Matrix4x4 orthogonal_matrix = GutMatrixOrthoRH_OpenGL(5.0f, 5.0f, 0.1f, 100.0f);
  109. // `把这两个矩阵相乘`
  110. Matrix4x4 view_orthogonal_matrix = view_matrix * orthogonal_matrix;
  111. // `把空间中的坐标点转换到屏幕坐标系上`
  112. Vector4 vertices[16];
  113. for ( int i=0; i<16; i++ )
  114. {
  115. vertices[i] = g_vertices[i] * view_orthogonal_matrix;
  116. vertices[i] /= vertices[i].GetW();
  117. }
  118. // `画出金字塔的8条边线`
  119. glBegin(GL_LINES);
  120. for ( int l=0; l<8; l++ )
  121. {
  122. glVertex3fv((float *) &vertices[l*2]);
  123. glVertex3fv((float *) &vertices[l*2+1]);
  124. }
  125. glEnd();
  126. // `把背景backbuffer的画面显示出来`
  127. GutSwapBuffersOpenGL();
  128. }