KRIGSSVIN
930 постов
Карма: 53
#61 19 октября 2010 в 16:06
r_avertexnormals[verts->lightnormalindex][1-2-3]
<br />Индексация идёт от 0 до 2. Хранятся в виде абсолютной величины.
jeank
43 постов
Карма: 4
#62 19 октября 2010 в 17:39
[quote author=KRIGSSVIN link=topic=597.msg14002#msg14002 date=1287504380]<br />Индексация идёт от 0 до 2. Хранятся в виде абсолютной величины.<br />[/quote]<br /><br />Ну да, от 0 до 2, я просто три штуки подразумевал.<br /><br />И эти нормали не работают, гады, для скошенных поверхностей, а для кубиков и любых перпендикулярных плоскостей все пучком.<br />В инете кто-то уже отписывался по такой же проблеме с нормалями для mdl и md2, но там решения так и не было, а в стандартных руководствах по моделям просто берутся эти нормали: glNormal3fv (anorms_table[pvert-&gt;normalIndex]);<br /><br />Вот мой код, вроде бы как все корректно делаю.<br /><br /> angles[PITCH] = currententity-&gt;angles[PITCH];<br /> angles[ROLL] = currententity-&gt;angles[ROLL];<br /> origin[0]=currententity-&gt;origin[0];<br /> origin[1]=currententity-&gt;origin[1];<br /> if(currententity-&gt;model-&gt;flags &amp; EF_ROTATE)<br /> {<br /> //rotate<br /> angles[YAW] = anglemod((currententity-&gt;origin[0]+currententity-&gt;origin[1])*0.8+(108*cl.time));<br /> //floating effect<br /> origin[2]=currententity-&gt;origin[2]+sin(currententity-&gt;origin[0]+currententity-&gt;origin[1]+(cl.time*3))*5.5;<br /> }<br /> else<br /> {<br /> angles[YAW] = currententity-&gt;angles[YAW];<br /> origin[2]=currententity-&gt;origin[2];<br /> }<br /><br /> //Modify player org<br /> //============================<br /> //VectorCopy(r_refdef.vieworg, playerorg); <br /> VectorCopy(r_origin, playerorg); <br /><br /> if (!(currententity-&gt;model-&gt;chromeflag &amp; CR_WEAPON))&nbsp; //Нулевой вектор.<br /> VectorSubtract (playerorg, origin, playerorg);<br /><br /><br /> if (angles[PITCH] || angles[YAW] || angles[ROLL])<br /> {<br /> vec3_t temp;<br /> vec3_t forward, right, up;<br /><br /> AngleVectors (angles, forward, right, up);<br /> VectorCopy (playerorg, temp);<br /> playerorg[PITCH] = DotProduct (temp, forward);<br /> playerorg[YAW] = -DotProduct (temp, right);<br /> playerorg[ROLL] = DotProduct (temp, up);<br /> }<br /><br /> glColor4f( chromealpha, chromealpha, chromealpha, chromealpha);<br /> glEnable (GL_BLEND);<br /> glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, 0.5);<br /><br /> while (1)<br /> {<br /> // get the vertex count and primitive type<br /> count = *order++;<br /> if (!count)<br /> break; // done<br /> if (count &lt; 0)<br /> {<br /> count = -count;<br /> glBegin (GL_TRIANGLE_FAN);<br /> }<br /> else<br /> glBegin (GL_TRIANGLE_STRIP);<br /><br /> do<br /> {<br /> //Normal<br /> if (lerping)<br /> {<br /> normal[0]=r_avertexnormals[verts1-&gt;lightnormalindex][0]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][0]*blend;<br /> normal[1]=r_avertexnormals[verts1-&gt;lightnormalindex][1]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][1]*blend;<br /> normal[2]=r_avertexnormals[verts1-&gt;lightnormalindex][2]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][2]*blend;<br /> lerpvert[0] = verts1-&gt;v[0]*iblend+verts2-&gt;v[0]*blend;<br /> lerpvert[1] = verts1-&gt;v[1]*iblend+verts2-&gt;v[1]*blend;<br /> lerpvert[2] = verts1-&gt;v[2]*iblend+verts2-&gt;v[2]*blend;<br /> //VectorNormalize (normal);<br /> VectorSubtract (playerorg, lerpvert, viewer);<br /> }<br /> else<br /> {<br /> normal[0]=r_avertexnormals[verts1-&gt;lightnormalindex][0];<br /> normal[1]=r_avertexnormals[verts1-&gt;lightnormalindex][1];<br /> normal[2]=r_avertexnormals[verts1-&gt;lightnormalindex][2];<br /> //VectorNormalize (normal);<br /> VectorSubtract (playerorg, verts1-&gt;v, viewer);<br /> }<br /> VectorNormalize (viewer); <br /> d = DotProduct (normal, viewer);<br /> <br /> reflected[0] = normal[0]*2*d - viewer[0]*0.2;<br /> reflected[1] = normal[1]*2*d - viewer[1]*0.2;<br /> reflected[2] = normal[2]*2*d - viewer[2]*0.2;<br />Ну и так далее....
KRIGSSVIN
930 постов
Карма: 53
#63 20 октября 2010 в 17:45
&nbsp; &nbsp; &nbsp; &nbsp; if (lerping)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; normal[0]=r_avertexnormals[verts1-&gt;lightnormalindex][0]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][0]*blend;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; normal[1]=r_avertexnormals[verts1-&gt;lightnormalindex][1]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][1]*blend;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; normal[2]=r_avertexnormals[verts1-&gt;lightnormalindex][2]*iblend+r_avertexnormals[verts2-&gt;lightnormalindex][2]*blend;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //VectorNormalize (normal);
<br />А чего закомментил?<br /><br />
&nbsp; &nbsp; &nbsp; &nbsp; reflected[0] = normal[0]*2*d - viewer[0]*0.2;<br />&nbsp; &nbsp; &nbsp; &nbsp; reflected[1] = normal[1]*2*d - viewer[1]*0.2;<br />&nbsp; &nbsp; &nbsp; &nbsp; reflected[2] = normal[2]*2*d - viewer[2]*0.2;
<br />Зачем умножаешь на 0.2?<br /><br />И ещё запости правильные и &quot;косые&quot; скриншоты.