#61
19 октября 2010 в 16:06
r_avertexnormals[verts->lightnormalindex][1-2-3]<br />Индексация идёт от 0 до 2. Хранятся в виде абсолютной величины.
#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->normalIndex]);<br /><br />Вот мой код, вроде бы как все корректно делаю.<br /><br /> angles[PITCH] = currententity->angles[PITCH];<br /> angles[ROLL] = currententity->angles[ROLL];<br /> origin[0]=currententity->origin[0];<br /> origin[1]=currententity->origin[1];<br /> if(currententity->model->flags & EF_ROTATE)<br /> {<br /> //rotate<br /> angles[YAW] = anglemod((currententity->origin[0]+currententity->origin[1])*0.8+(108*cl.time));<br /> //floating effect<br /> origin[2]=currententity->origin[2]+sin(currententity->origin[0]+currententity->origin[1]+(cl.time*3))*5.5;<br /> }<br /> else<br /> {<br /> angles[YAW] = currententity->angles[YAW];<br /> origin[2]=currententity->origin[2];<br /> }<br /><br /> //Modify player org<br /> //============================<br /> //VectorCopy(r_refdef.vieworg, playerorg); <br /> VectorCopy(r_origin, playerorg); <br /><br /> if (!(currententity->model->chromeflag & CR_WEAPON)) //Нулевой вектор.<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 < 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->lightnormalindex][0]*iblend+r_avertexnormals[verts2->lightnormalindex][0]*blend;<br /> normal[1]=r_avertexnormals[verts1->lightnormalindex][1]*iblend+r_avertexnormals[verts2->lightnormalindex][1]*blend;<br /> normal[2]=r_avertexnormals[verts1->lightnormalindex][2]*iblend+r_avertexnormals[verts2->lightnormalindex][2]*blend;<br /> lerpvert[0] = verts1->v[0]*iblend+verts2->v[0]*blend;<br /> lerpvert[1] = verts1->v[1]*iblend+verts2->v[1]*blend;<br /> lerpvert[2] = verts1->v[2]*iblend+verts2->v[2]*blend;<br /> //VectorNormalize (normal);<br /> VectorSubtract (playerorg, lerpvert, viewer);<br /> }<br /> else<br /> {<br /> normal[0]=r_avertexnormals[verts1->lightnormalindex][0];<br /> normal[1]=r_avertexnormals[verts1->lightnormalindex][1];<br /> normal[2]=r_avertexnormals[verts1->lightnormalindex][2];<br /> //VectorNormalize (normal);<br /> VectorSubtract (playerorg, verts1->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 />Ну и так далее....
#63
20 октября 2010 в 17:45
if (lerping)<br /> {<br /> normal[0]=r_avertexnormals[verts1->lightnormalindex][0]*iblend+r_avertexnormals[verts2->lightnormalindex][0]*blend;<br /> normal[1]=r_avertexnormals[verts1->lightnormalindex][1]*iblend+r_avertexnormals[verts2->lightnormalindex][1]*blend;<br /> normal[2]=r_avertexnormals[verts1->lightnormalindex][2]*iblend+r_avertexnormals[verts2->lightnormalindex][2]*blend;<br /><br /> //VectorNormalize (normal);<br />А чего закомментил?<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 />Зачем умножаешь на 0.2?<br /><br />И ещё запости правильные и "косые" скриншоты.