⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_27.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td><td valign="top" width="100%"><p>现在从setConnectivity函数开始,事情变得越来越复杂了,这个函数用来查找每个面的相邻的顶点,下面是它的伪代码: 
      </p>
      </td><td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>对于模型中的每一个面A<br>	对于面A中的每一条边<br>		如果我们不只到这条边相邻的顶点<br>			那么对于模型中除了面A外的每一个面B<br>				对于面B中的每一条边<br>					如果面A的边和面B的边是同一条边,那么这两个面相邻<br>						设置面A和面B的相邻属性</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td>
    <td valign="top" width="100%">下面的代码完成上面伪代码中最后两行的内容,你先获得每个面中边的两个顶点,然后检测他们是否相邻,如果是则设置各自的相邻顶点信息</td>
    <td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	int vertA1 = pFaceA-&gt;vertexIndices[edgeA];
	int vertA2 = pFaceA-&gt;vertexIndices[( edgeA+1 )%3];

	int vertB1 = pFaceB-&gt;vertexIndices[edgeB];
	int vertB2 = pFaceB-&gt;vertexIndices[( edgeB+1 )%3];

	<font color="#ffffaa">// 测试他们是否为同一边,如果是则设置相应的相邻顶点信息</font>
	if (( vertA1 == vertB1 &amp;&amp; vertA2 == vertB2 ) || ( vertA1 == vertB2 &amp;&amp; vertA2 == vertB1 ))
	{
		pFaceA-&gt;neighbourIndices[edgeA] = faceB;
		pFaceB-&gt;neighbourIndices[edgeB] = faceA;
		edgeFound = true;
		break;
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody><tr>
    <td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td>
  </tr>
</tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody><tr>
    <td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td>
    <td valign="top" width="100%">完整的SetConnectivity函数的代码如下</td>
    <td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td>
  </tr>
</tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody><tr>
    <td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td>
    <td><img src="Tutorial_27_files/br.png" height="28" width="28"></td>
  </tr>
</tbody></table>
<pre><font color="#aaffaa" size="3">
<font color="#ffffaa">// 设置相邻顶点信息</font>
inline void SetConnectivity(glObject *o){
	unsigned int p1i, p2i, p1j, p2j;
	unsigned int P1i, P2i, P1j, P2j;
	unsigned int i,j,ki,kj;

	<font color="#ffffaa">//对于模型中的每一个面A</font>
	for(i=0;i<o->nPlanes-1;i++)
	{
		<font color="#ffffaa">//对于除了此面的其它的面B</font>
		for(j=i+1;j<o->nPlanes;j++)
		{
			<font color="#ffffaa">//对于面A中的每一个相邻的顶点</font>
			for(ki=0;ki&lt;3;ki++)
			{
				<font color="#ffffaa">//如果这个相邻的顶点没有被设置</font>
				if(!o-&gt;planes[i].neigh[ki])
				{
					for(kj=0;kj&lt;3;kj++)
					{
						p1i=ki;
						p1j=kj;
						p2i=(ki+1)%3;
						p2j=(kj+1)%3;

						p1i=o-&gt;planes[i].p[p1i];
						p2i=o-&gt;planes[i].p[p2i];
						p1j=o-&gt;planes[j].p[p1j];
						p2j=o-&gt;planes[j].p[p2j];
				
						<font color="#ffffaa">//如果面A的边P1i-&gt;P1j和面B的边P2i-&gt;P2j为同一条边,则又下面的公式的P1i=P1j,并且P2i=P2j</font>
						P1i=((p1i+p2i)-abs(p1i-p2i))/2;
						P2i=((p1i+p2i)+abs(p1i-p2i))/2;
						P1j=((p1j+p2j)-abs(p1j-p2j))/2;
						P2j=((p1j+p2j)+abs(p1j-p2j))/2;

						<font color="#ffffaa">//记录与这个边相邻的面的索引</font>
						if((P1i==P1j) &amp;&amp; (P2i==P2j))
						{
							o-&gt;planes[i].neigh[ki] = j+1;	  
							o-&gt;planes[j].neigh[kj] = i+1;	  
						}
					}
				}
			}
		}
	}
}
</o-></o-></font></pre>
<font color="#aaffaa" size="3"> </font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td>
    <td valign="top" width="100%">下面的函数用来绘制模型</td>
    <td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"></font><pre><font color="#aaffaa" size="3"><font color="#ffffaa">// 绘制模型,像以前一样它绘制组成模型的三角形</font>
void drawObject( const ShadowedObject&amp; object )
{
	glBegin( GL_TRIANGLES );
	for ( int i = 0; i &lt; object.nFaces; i++ )
	{
		const Face&amp; face = object.pFaces[i];

		for ( int j = 0; j &lt; 3; j++ )
		{
			const Point3f&amp; vertex = object.pVertices[face.vertexIndices[j]];

			glNormal3f( face.normals[j].x, face.normals[j].y, face.normals[j].z );
			glVertex3f( vertex.x, vertex.y, vertex.z );
		}
	}
	glEnd();
}
</font></pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td>
    <td valign="top" width="100%">下面的函数用来计算平面的方程参数</td>
    <td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">void calculatePlane( const ShadowedObject&amp; object, Face&amp; face )
{
	<font color="#ffffaa">// 获得平面的三个顶点</font>
	const Point3f&amp; v1 = object.pVertices[face.vertexIndices[0]];
	const Point3f&amp; v2 = object.pVertices[face.vertexIndices[1]];
	const Point3f&amp; v3 = object.pVertices[face.vertexIndices[2]];

	face.planeEquation.a = v1.y*(v2.z-v3.z) + v2.y*(v3.z-v1.z) + v3.y*(v1.z-v2.z);
	face.planeEquation.b = v1.z*(v2.x-v3.x) + v2.z*(v3.x-v1.x) + v3.z*(v1.x-v2.x);
	face.planeEquation.c = v1.x*(v2.y-v3.y) + v2.x*(v3.y-v1.y) + v3.x*(v1.y-v2.y);
	face.planeEquation.d = -( v1.x*( v2.y*v3.z - v3.y*v2.z ) +
				v2.x*(v3.y*v1.z - v1.y*v3.z) +
				v3.x*(v1.y*v2.z - v2.y*v1.z) );
}
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_27_files/l.png"><img src="Tutorial_27_files/l.png"></td>
    <td valign="top" width="100%">你还可以呼吸么?好的,我们继续:) 接下来你将学习如何去投影,castShadow函数几乎用到了所有OpenGL的功能,完成这个函数后,把它传递到doShadowPass函数来通过两个渲染通道绘制出阴影.<br>
      首先,我们看看哪些面面对着灯光,我们可以通过灯光位置和平面方程计算出.如果灯光到平面的位置大于0,则位于灯光的上方,否则位于灯光的下方(如果有什么问题,翻一下你高中的解析几何).</td>
    <td background="Tutorial_27_files/r.png"><img src="Tutorial_27_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_27_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_27_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_27_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>void castShadow( ShadowedObject&amp; object, GLfloat *lightPosition )
{
	<font color="#ffffaa">// 设置哪些面在灯光的前面</font>
	for ( int i = 0; i &lt; object.nFaces; i++ )
	{
		const Plane&amp; plane = object.pFaces[i].planeEquation;

		GLfloat side = plane.a*lightPosition[0]+
			plane.b*lightPosition[1]+
			plane.c*lightPosition[2]+
			plane.d;

		if ( side &gt; 0 )
			object.pFaces[i].visible = true;
		else
			object.pFaces[i].visible = false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -