博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL超级宝典笔记——使用光源
阅读量:6877 次
发布时间:2019-06-26

本文共 18707 字,大约阅读时间需要 62 分钟。

hot3.png

<h3>使用光源</h3> <p>要模拟真实世界,仅有环境光是不够的,需要指定更多的光源来提升真实感。OpenGL至少提供8种光源,可以在场景中的任意位置甚至是可视区域之外。你可以指定光源位于无限远处以获得平行光束,或者光源位于近处向外发射光束。还可以制造出聚光灯的效果。</p> <h4>选择哪种方式?</h4> <p>你可以指定一个光源位于哪里朝哪个方向发射光线。通常光源朝所有方向发射光线,但也可以为它指定方向。在指定的方向的光源环境下,并非每个多边形都需要被照射到。我们可以制造物体的阴影效果。OpenGL可以计算光线和物体的角度。</p> <p>如下图:光源发射出的光线照射到四边形上,形成一个入射角,再反射到观察者眼中形成一个反射角。根据这个入射角和反射角结合光源和材料的属性我们可以计算出该点应呈现出什么样的颜色。</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225236_46lU.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225237_9mjX.png" width="465" height="190"></a></p> <p>在编程的角度上看,每一个多边形由一系列的顶点创建的。多边形就是由点组成的,那么如何计算光线与点之间的角度。我们无法在3D空间中找到一个切确的线与点之间的角度,因此我们为每一个点设置一个法线。三维平面的法线是垂直于该平面的三维<a href="http://zh.wikipedia.org/wiki/%E5%90%91%E9%87%8F">向量</a>。曲面在某点P处的法线为垂直于该点<a href="http://zh.wikipedia.org/w/index.php?title=%E5%88%87%E5%B9%B3%E9%9D%A2&amp;action=edit&amp;redlink=1">切平面</a>的向量。(wiki)</p> <h4>平面法线</h4> <p>法线向量是一条垂直于真实平面或虚拟平面的线。下图是2D和3D中的法线向量。</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225238_BWnE.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225238_KA4G.png" width="477" height="172"></a></p> <p>为什么需要为每个顶点设置法线向量,而不是为一个多边形指定一个法线向量。其中的原因是,并不是所有的物体的表面都是平的,有时法线向量并不需要精确地垂直于物体的表面。通过扭曲平面的法线向量可以制造出光滑的曲面的视觉效果。</p> <h4>指定法线</h4> <p><a href="http://static.oschina.net/uploads/img/201310/10225238_X3Df.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225239_pecf.png" width="562" height="297"></a></p> <p>如上图:为多边形的顶点(1,1,0)处指定一个法线向量,我们可以选定一另个点(1,10,0),并以(1,1,0)为起点连接第二个点(1,10,0),所形成的线就是法线向量。第二个点说明了法线向量的方向是y轴向上。法线向量的方向还可以用于表明多边形的正面和反面。法线是由正面指向外面的(或者说从法线的箭头方向往下看到的就是多边形的正面)。</p> <p>用法线的第二个点减去第一个顶点,所得的结果就是相对于x、y和z的单位距离。 <p> (1,10,0) - (1,1,0) = (0,9,0) <p>如果把这个顶点移动到原点,上面两点相减得出的点指定了和表面呈90度角的方向。如下图:</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225239_OcrL.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image[1]" border="0" alt="Image[1]" src="http://static.oschina.net/uploads/img/201310/10225240_94EX.png" width="504" height="371"></a></p> <p>向量的方向告诉OpenGL顶点所在多边形的面朝哪个方向的。下面的例子演示如何指定法线向量 <p>glBegin(GL_TRIANGLES); <p>&nbsp;&nbsp;&nbsp;&nbsp; glNormal3f(0.0f, -1.0f, 0.0f); <p>&nbsp;&nbsp;&nbsp;&nbsp; glVertex3f(0.0f, 0.0f, 60.0f); <p>&nbsp;&nbsp;&nbsp;&nbsp; glVertex3f(-15.0f, 0.0f, 30.0f); <p>&nbsp;&nbsp;&nbsp;&nbsp; glVertex3f(15.0f, 0.0f, 30.0f); <p>glEnd(); <p>glNormal3f接受3个表示坐标的值,指定一条垂直于三角形表面的法线向量。上面的例子的三个顶点的法线具有相同的方向。 <h4>单位法线</h4> <p>单位法线即长度为1的法线向量。已知法线向量(x,y,z)求单位法线,先求出法线向量的长度即<a href="http://static.oschina.net/uploads/img/201310/10225241_rGVv.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225242_OTHI.png" width="240" height="87"></a>,再用(x,y,z)除以这个长度,就得到单位法线。这个过程叫归一化(normalization)。在光照计算的中所有的法线向量都会归一化。</p> <p>可以让OpenGL自动把法线向量转换为单位法线,通过调用glEnable接受一个参数GL_NORMALIZE;</p> <p>glEnable(GL_NORMALIZE);</p> <p>这种做法在某些实现上,会带来性能的开销。最好的方式在指定法线向量的时候,就直接指定为单位法线,而不是依靠OpenGL来帮你做转换。</p> <p><font style="background-color: #ffff00">PS:glScale缩放函数也会缩放法线的长度。如果一起使用glScale和光照,有可能会得到不是你想要的光照效果。</font></p> <p>如果每个顶点指定的法线都是单位法线,并且glScale使用相同的比例进行缩放的情况下,有一个替代方案是使用GL_RESCALE_NORMALS替代GL_NORMALIZE.</p> <p>glEnable(GL_RESCALE_NORMALS);</p> <p>这样就告诉了OpenGL,你的法线向量不是单位长度的,但是可以通过相同比例因子的缩放来把它转化为单位长度(单位法线)。这样OpenGL会检查你的模型视图变换矩阵来逆转换。这样在每个顶点所做的数学操作要少一些。</p> <p>个人理解:</p> <p>一个单位法线向量(1.0,1.0,1.0),在进行过glScalef(2.0, 2.0, 2.0)之后,就变为了(2.0,2.0,2.0),那么在启用了GL_RESCALE_NORMALS之后,OpenGL会检查模型视图矩阵得知,可以通过反向的缩放把法线向量转换会单位法线即等比例的缩小2倍乘以0.5.又得到了(1.0, 1.0, 1.0)。</p> <p>PS:最佳实践是在一开始为顶点指定法线时,就指定为单位法线。</p> <h4>寻找法线</h4> <p>当一个多边形不平行于任何一个轴面时,通过简单的观察来指定一个法线会比较困难。所以需要一个简单的方法来计算3D空间中任意多边形的法线。</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225242_otEG.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225243_xVh3.png" width="525" height="270"></a></p> <p>可以通过多边形上的任意三个点来计算法线。</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225243_vtfO.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225244_bx8r.png" width="544" height="220"></a></p> <p>如上图,知道了P1,P2,P3点之后。由P1和P2可以求出向量V1,P1和P3可以求出向量V2,再用V1 X V2(叉乘)计算得出正交于V1和V2的法线向量。</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225244_260n.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225246_vjUX.png" width="561" height="236"></a></p> <p>math3d代码示例:</p> <div><pre class="csharpcode"><span class="kwrd">void</span> m3dFindNormal(M3DVector3f vNormal, <span class="kwrd">const</span> M3DVector3f vP1, <span class="kwrd">const</span> M3DVector3f vP2, <span class="kwrd">const</span> M3DVector3f vP3)<br>{<br> M3DVector3f v1, v2;<br> v1[0] = vP2[0] - vP1[0];<br> v1[1] = vP2[1] - vP1[1];<br> v1[2] = vP2[2] - vP1[2];<br><br> v2[0] = vP3[0] - vP1[0];<br> v2[1] = vP3[1] - vP1[1];<br> v2[2] = vP3[2] - vP1[2];<br><br> m3dCrossProduct(vNormal, v1, v2);<br>}</pre></div> <h4>设置光源</h4> <p>创建一个位于左上角的温和的白光光源。</p> <div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode">GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};<br>GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};<br><br><span class="rem">//设置和开启光源light0</span><br>glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);<br>glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);<br><br><span class="rem">//开启光照</span><br>glEnable(GL_LIGHT0);<br><br><span class="rem">//设置光源位置</span><br>GLfloat lightPos[] = {-50.f, 50.f, 100.0f, 1.0f};<br>glLightfv(GL_LIGHT0, GL_POSITION, lightPos);<br><br><br></pre><br></div> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <div>&nbsp;</div> <div>lightPos中最后一个值1.0说明这个lightPos指定了光源的位置,如果这个值是0.0,则指定了光源在无限远处。 <h4>设置材料属性</h4> <p>开启颜色追踪</p> <p>glEnable(GL_COLOR_MATERIAL);</p> <p>glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);</p> <h4>设置多边形和法线向量</h4> <div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode">...<br>...<br>{<br> M3DVector3f vPoints[3] = {

{ 15.0f, 0.0f, 30.0f},<br> { 0.0f, 15.0f, 30.0f},<br> { 0.0f, 0.0f, 60.0f}};<br><br> <span class="rem">// 计算法线向量</span><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> } <br>...<br>... </pre><br></div>喷气式飞机的完整代码:</div> <div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode"><span class="rem">// LitJet.cpp</span><br><span class="rem">// OpenGL SuperBible</span><br><span class="rem">// Demonstrates OpenGL Lighting</span><br><span class="rem">// Program by Richard S. Wright Jr.</span><br><br><span class="preproc">#include</span> <span class="str">"gltools.h"</span> <span class="rem">// gltools library</span><br><span class="preproc">#include</span> <span class="str">"math3d.h"</span> <span class="rem">// 3D Math Library</span><br><br><span class="rem">// Rotation amounts</span><br><span class="kwrd">static</span> GLfloat xRot = 0.0f;<br><span class="kwrd">static</span> GLfloat yRot = 0.0f;<br><br><br><span class="rem">// Called to draw scene</span><br><span class="kwrd">void</span> RenderScene(<span class="kwrd">void</span>)<br>{<br> M3DVector3f vNormal; <span class="rem">// Storeage for calculated surface normal</span><br><br> <span class="rem">// Clear the window with current clearing color</span><br> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br><br> <span class="rem">// Save the matrix state and do the rotations</span><br> glPushMatrix();<br> glRotatef(xRot, 1.0f, 0.0f, 0.0f);<br> glRotatef(yRot, 0.0f, 1.0f, 0.0f);<br><br><br> <span class="rem">// Nose Cone - Points straight down</span><br> <span class="rem">// Set material color</span><br> glColor3ub(128, 128, 128);<br> glBegin(GL_TRIANGLES);<br> glNormal3f(0.0f, -1.0f, 0.0f);<br> glNormal3f(0.0f, -1.0f, 0.0f);<br> glVertex3f(0.0f, 0.0f, 60.0f);<br> glVertex3f(-15.0f, 0.0f, 30.0f);<br> glVertex3f(15.0f,0.0f,30.0f);<br><br><br> <span class="rem">// Verticies for this panel</span><br> {<br> M3DVector3f vPoints[3] = {
{ 15.0f, 0.0f, 30.0f},<br> { 0.0f, 15.0f, 30.0f},<br> { 0.0f, 0.0f, 60.0f}};<br><br> <span class="rem">// Calculate the normal for the plane</span><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> } <br><br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f, 0.0f, 60.0f },<br> { 0.0f, 15.0f, 30.0f },<br> { -15.0f, 0.0f, 30.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> <span class="rem">// Body of the Plane </span><br> {<br> M3DVector3f vPoints[3] = {
{ -15.0f, 0.0f, 30.0f },<br> { 0.0f, 15.0f, 30.0f },<br> { 0.0f, 0.0f, -56.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f, 0.0f, -56.0f },<br> { 0.0f, 15.0f, 30.0f },<br> { 15.0f,0.0f,30.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> glNormal3f(0.0f, -1.0f, 0.0f);<br> glVertex3f(15.0f,0.0f,30.0f);<br> glVertex3f(-15.0f, 0.0f, 30.0f);<br> glVertex3f(0.0f, 0.0f, -56.0f);<br><br> <span class="rem">///</span><br> <span class="rem">// Left wing</span><br> <span class="rem">// Large triangle for bottom of wing</span><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f,2.0f,27.0f },<br> { -60.0f, 2.0f, -8.0f },<br> { 60.0f, 2.0f, -8.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> {<br> M3DVector3f vPoints[3] = {
{ 60.0f, 2.0f, -8.0f},<br> {0.0f, 7.0f, -8.0f},<br> {0.0f,2.0f,27.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{60.0f, 2.0f, -8.0f},<br> {-60.0f, 2.0f, -8.0f},<br> {0.0f,7.0f,-8.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{0.0f,2.0f,27.0f},<br> {0.0f, 7.0f, -8.0f},<br> {-60.0f, 2.0f, -8.0f}};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> <span class="rem">// Tail section///</span><br> <span class="rem">// Bottom of back fin</span><br> glNormal3f(0.0f, -1.0f, 0.0f);<br> glVertex3f(-30.0f, -0.50f, -57.0f);<br> glVertex3f(30.0f, -0.50f, -57.0f);<br> glVertex3f(0.0f,-0.50f,-40.0f);<br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f,-0.5f,-40.0f },<br> {30.0f, -0.5f, -57.0f},<br> {0.0f, 4.0f, -57.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f, 4.0f, -57.0f },<br> { -30.0f, -0.5f, -57.0f },<br> { 0.0f,-0.5f,-40.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{ 30.0f,-0.5f,-57.0f },<br> { -30.0f, -0.5f, -57.0f },<br> { 0.0f, 4.0f, -57.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f,0.5f,-40.0f },<br> { 3.0f, 0.5f, -57.0f },<br> { 0.0f, 25.0f, -65.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> {<br> M3DVector3f vPoints[3] = {
{ 0.0f, 25.0f, -65.0f },<br> { -3.0f, 0.5f, -57.0f},<br> { 0.0f,0.5f,-40.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br> {<br> M3DVector3f vPoints[3] = {
{ 3.0f,0.5f,-57.0f },<br> { -3.0f, 0.5f, -57.0f },<br> { 0.0f, 25.0f, -65.0f }};<br><br> m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]);<br> glNormal3fv(vNormal);<br> glVertex3fv(vPoints[0]);<br> glVertex3fv(vPoints[1]);<br> glVertex3fv(vPoints[2]);<br> }<br><br><br> glEnd();<br><br> <span class="rem">// Restore the matrix state</span><br> glPopMatrix();<br> <span class="rem">// Display the results</span><br> glutSwapBuffers();<br>}<br><br><span class="rem">// This function does any needed initialization on the rendering</span><br><span class="rem">// context. </span><br><span class="kwrd">void</span> SetupRC()<br>{<br> <span class="rem">// Light values and coordinates</span><br> GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };<br> GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };<br><br> glEnable(GL_DEPTH_TEST); <span class="rem">// Hidden surface removal</span><br> glFrontFace(GL_CCW); <span class="rem">// Counter clock-wise polygons face out</span><br> glEnable(GL_CULL_FACE); <span class="rem">// Do not calculate inside of jet</span><br><br> <span class="rem">// Enable lighting</span><br> glEnable(GL_LIGHTING);<br><br> <span class="rem">// Setup and enable light 0</span><br> glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);<br> glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);<br> glEnable(GL_LIGHT0);<br><br> <span class="rem">// Enable color tracking</span><br> glEnable(GL_COLOR_MATERIAL);<br><br> <span class="rem">// Set Material properties to follow glColor values</span><br> glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);<br><br> <span class="rem">// Light blue background</span><br> glClearColor(0.0f, 0.0f, 1.0f, 1.0f );<br><br> glEnable(GL_NORMALIZE);<br>}<br><br><span class="rem">/</span><br><span class="rem">// Handle arrow keys</span><br><span class="kwrd">void</span> SpecialKeys(<span class="kwrd">int</span> key, <span class="kwrd">int</span> x, <span class="kwrd">int</span> y)<br>{<br> <span class="kwrd">if</span>(key == GLUT_KEY_UP)<br> xRot-= 5.0f;<br><br> <span class="kwrd">if</span>(key == GLUT_KEY_DOWN)<br> xRot += 5.0f;<br><br> <span class="kwrd">if</span>(key == GLUT_KEY_LEFT)<br> yRot -= 5.0f;<br><br> <span class="kwrd">if</span>(key == GLUT_KEY_RIGHT)<br> yRot += 5.0f;<br><br> <span class="kwrd">if</span>(key &gt; 356.0f)<br> xRot = 0.0f;<br><br> <span class="kwrd">if</span>(key &lt; -1.0f)<br> xRot = 355.0f;<br><br> <span class="kwrd">if</span>(key &gt; 356.0f)<br> yRot = 0.0f;<br><br> <span class="kwrd">if</span>(key &lt; -1.0f)<br> yRot = 355.0f;<br><br> <span class="rem">// Refresh the Window</span><br> glutPostRedisplay();<br>}<br><br><br><span class="rem">//</span><br><span class="rem">// Reset projection and light position</span><br><span class="kwrd">void</span> ChangeSize(<span class="kwrd">int</span> w, <span class="kwrd">int</span> h)<br>{<br> GLfloat fAspect;<br> GLfloat lightPos[] = { -50.f, 50.0f, 100.0f, 1.0f };<br><br> <span class="rem">// Prevent a divide by zero</span><br> <span class="kwrd">if</span>(h == 0)<br> h = 1;<br><br> <span class="rem">// Set Viewport to window dimensions</span><br> glViewport(0, 0, w, h);<br><br> <span class="rem">// Reset coordinate system</span><br> glMatrixMode(GL_PROJECTION);<br> glLoadIdentity();<br><br> fAspect = (GLfloat) w / (GLfloat) h;<br> gluPerspective(45.0f, fAspect, 1.0f, 225.0f);<br><br> glMatrixMode(GL_MODELVIEW);<br> glLoadIdentity();<br><br> glLightfv(GL_LIGHT0,GL_POSITION,lightPos);<br> glTranslatef(0.0f, 0.0f, -150.0f);<br>}<br><br><span class="kwrd">int</span> main(<span class="kwrd">int</span> argc, <span class="kwrd">char</span>* argv[])<br>{<br> glutInit(&amp;argc, argv);<br> glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);<br> glutInitWindowSize(800,600);<br> glutCreateWindow(<span class="str">"Lighted Jet"</span>);<br> glutReshapeFunc(ChangeSize);<br> glutSpecialFunc(SpecialKeys);<br> glutDisplayFunc(RenderScene);<br> SetupRC();<br> glutMainLoop();<br><br> <span class="kwrd">return</span> 0;<br>}<br></pre><br></div>

<p>效果</p> <p><a href="http://static.oschina.net/uploads/img/201310/10225246_SIt6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201310/10225247_pC89.png" width="244" height="240"></a></p>

转载于:https://my.oschina.net/sweetdark/blog/167835

你可能感兴趣的文章
linux远程桌面链接windows
查看>>
TrendMicro:新的APT***针对亚洲和欧洲政府组织,包括中国媒体机构
查看>>
C语言中sizeof与strlen区别2
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
UIWebView加载html网页时使用缓存和清空缓存
查看>>
我的友情链接
查看>>
设计模式学习笔记(六)之策略模式(Strategy)
查看>>
python运行spark脚本程序
查看>>
我的友情链接
查看>>
通过libvirt使用ceph块设备
查看>>
优秀交互设计师成长指南
查看>>
SDN网络系统之MiniNet的安装与使用
查看>>
java的Iterator和listIterator的区别
查看>>
服务器虚拟化的好处
查看>>
AxureRP7.0基础教程系列 部件详解 表格Tabel
查看>>
ORACLE之sql语句优化
查看>>
一台机器同时启动多个tomcat
查看>>
Java中的多线程
查看>>