jeank
43 постов
Карма: 4
#51 17 сентября 2010 в 22:46
Спасибо! <br /><br />А вот с нормалью какая-то ерунда выходит.<br /><br />Я пробовал использовать из входящей поверхности (msurface_t *s) s-&gt;plane-&gt;normal, потом пробовал в цикле перебирающем вершины суммировать нормаль с координатами каждой вершины, все одно ерунда выходит...&nbsp; Уже разные извращения пробовал :(<br /><br />p = s-&gt;polys;<br />v = p-&gt;verts[0];<br /><br />normal[0]=s-&gt;plane-&gt;normal[0];<br />normal[1]=s-&gt;plane-&gt;normal[1];<br />normal[2]=s-&gt;plane-&gt;normal[2];<br /><br />//glNormal3fv(normal);<br />/*<br />// vect1[0]=v[0]-v[VERTEXSIZE+0];<br />// vect1[1]=v[1]-v[VERTEXSIZE+1];<br />// vect1[2]=v[2]-v[VERTEXSIZE+2];<br />// vect2[0]=v[VERTEXSIZE+0]-v[2*VERTEXSIZE+0];<br />// vect2[1]=v[VERTEXSIZE+1]-v[2*VERTEXSIZE+1];<br />// vect2[2]=v[VERTEXSIZE+2]-v[2*VERTEXSIZE+2];<br />// CrossProduct(vect1, vect2, normal);<br />*/<br /><br />for (i=0 ; i&lt;p-&gt;numverts ; i++, v+= VERTEXSIZE)<br />{<br /> //normal[0]=s-&gt;plane-&gt;normal[0]+v[0];<br /> //normal[1]=s-&gt;plane-&gt;normal[1]+v[1];<br /> //normal[2]=s-&gt;plane-&gt;normal[2]+v[2];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VectorSubtract (r_refdef.vieworg, v, viewer);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VectorNormalize (viewer);<br /><br /> d = DotProduct (normal, viewer);<br /> reflected[0] = normal[0]*2*d - viewer[0];<br /> reflected[1] = normal[1]*2*d - viewer[1];<br /> reflected[2] = normal[2]*2*d - viewer[2];<br /><br /> nv2[0] = 0.5 + reflected[1] * 0.5;<br /> nv2[1] = 0.5 - reflected[2] * 0.5;<br /> glTexCoord2f (nv2[0], nv2[1]);<br /> glVertex3fv (v);<br />}<br /><br />И непонятно, где же грабли...
KRIGSSVIN
930 постов
Карма: 53
#52 20 сентября 2010 в 07:49
//normal[0]=s-&gt;plane-&gt;normal[0]+v[0];<br /> //normal[1]=s-&gt;plane-&gt;normal[1]+v[1];<br /> //normal[2]=s-&gt;plane-&gt;normal[2]+v[2];
<br /><br />Удали. Тебе нужны нормали или от вершин - их нужно считать на загрузке карты, или от сурфа. Для начала возьми от сурфа. Только стоит учесть, что в Q2, чтобы пользовать s-&gt;plane-&gt;normal, нужно проверять, имеет ли сурф флаг SURF_PLANEBACK, и, если имеет, брать инвертированную нормаль.<br />
Barnes
1972 постов
Карма: 153
#53 20 сентября 2010 в 08:01
а не проще наложить текстуру как энв?
Какой богатый внутренний мир! Дай-ка посмотрю.....
jeank
43 постов
Карма: 4
#54 20 сентября 2010 в 09:40
KRIGSSVIN - да, там я закомментил, просто когда не получалось, стал пробовать разные извращения &quot;на авось&quot;.<br /><br />Barnes, блин, а ты оказался прав, реально проще, я повыбрасывал все GL_SPHERE_MAP и ура, оно заработало! <br />Правда я пока ни фига не понимаю, почему заработало, в Q3 как раз GL_SPHERE_MAP используется и там этот код работает.<br /><br />И еще маленький вопрос по отражениям - в Q3 стоит парсер и все параметры описаны в текстовых файлах шейдеров, поэтому из чистого сорса ничего не увидеть, но мне хочется узнать, какими комбинациями они добились блеска крутящихся единичек брони. <br />Там просто так текстуры подобраны или там&nbsp; что-то хитрое прописано для opengl?<br /><br />У меня эффект хрома получается таким параметром:<br />glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, gl_shinyK);<br />Ну еще метод смешения я указывал<br />glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); <br /><br />Но оно не блестит так ярко, как в Q3. <br /><br />P.S. Интересно, есть ли подобные утилитки (http://www.andersriggelsen.dk/OpenGL/) на другие функции OpenGL? <br />Меня эта страничка часто выручает, но там только по бленд.
Barnes
1972 постов
Карма: 153
#55 20 сентября 2010 в 12:49
Barnes, блин, а ты оказался прав, реально проще, я повыбрасывал все GL_SPHERE_MAP и ура, оно заработало! <br />Правда я пока ни фига не понимаю, почему заработало, в Q3 как раз GL_SPHERE_MAP используется и там этот код работает.
<br />Я какраз и имел ввиду GL_SPHERE_MAP. И в ку3 я его не помню там вроде через цпу считало все<br /><br />попробуй еще<br />glBlendFunc(GL_DST_COLOR, GL_ONE);<br />
Какой богатый внутренний мир! Дай-ка посмотрю.....
jeank
43 постов
Карма: 4
#56 20 сентября 2010 в 20:05
Barnes, KRIGSSVIN, спасибо за помощь, буду копать дальше
jeank
43 постов
Карма: 4
#57 08 октября 2010 в 19:13
Камрады, всем опять привет.<br /><br />Я хотел спросить про нормали. <br /><br />Как я понял, в движке для любой модели нормали вытаскиваются из предрассчитанных в anorm_dots.h по индексу нормали, в общем я их стал использовал для EnvMapping, оно конечно работает, но работает вкривь и вкось, не по правилам отражения вообще. Причем на статических брашах, где я брал нормаль от сурфа, все пучком, значит алгоритм работает, неправильно работают исходные данные.<br /><br />Все было сначала непонятно, я сперва грешил что нормали не те или вообще левые, но когда я тупо по ним отрисовал линии из нулевой точки модели, оказалось что нормали выглядят правильно, значит дело не в них а в самих координатах либо поворотах модели, и я теперь думаю что придется задействовать - углы поворота entities или надо как-то выходить на матрицу моделей (при отрисовке все выводится правильно, значит в активной матрице все отработано корректно, а проблемы возникают при расчетах вектора отражения, который использует нормаль, координату вершины и координату точки зрения). <br />Это получается, для отрисовки самих вершин ничего трогать не надо, а всех расчетов надо поворачивать и каждую вершину, и каждую нормаль. <br />Вот и вопрос - откуда лучше брать эти самые повороты.
Берсеркер
2319 постов
Карма: 216
#58 09 октября 2010 в 04:28
Это получается, для отрисовки самих вершин ничего трогать не надо, а всех расчетов надо поворачивать и каждую вершину, и каждую нормаль.
<br />гораздо оптимальнее переместить и повернуть Магомета, а не целую гору&nbsp; ;D<br /><br />Вот кусок кода из q2bers:<br /> vec3_t oldorg;<br /> VectorCopy(r_origin, oldorg);&nbsp; // сохранить координаты камеры<br /><br /> VectorSubtract (r_origin, currententity-&gt;origin, r_origin);&nbsp; // currententity - это текущий энтити = брашмодель<br /><br /> if (currententity-&gt;angles[0] || currententity-&gt;angles[1] || currententity-&gt;angles[2])&nbsp; // Если бмодель вращается...<br /> {<br /> vec3_t temp;<br /> vec3_t forward, right, up;<br /><br /> AngleVectors (currententity-&gt;angles, forward, right, up);<br /><br /> VectorCopy (r_origin, temp);<br /> r_origin[0] = DotProduct (temp, forward);<br /> r_origin[1] = -DotProduct (temp, right);<br /> r_origin[2] = DotProduct (temp, up);<br /> }<br /><br /> glPushMatrix ();<br /> R_RotateForEntity (currententity);<br /><br /> R_DrawInlineBModel();&nbsp; // рисуем бмодель как обычно...<br /><br /> glPopMatrix ();<br /><br /> VectorCopy(oldorg, r_origin);&nbsp; // восстановить коориданты камеры
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
jeank
43 постов
Карма: 4
#59 09 октября 2010 в 12:22
Мысль понял, спасибо!!!!
jeank
43 постов
Карма: 4
#60 19 октября 2010 в 14:09
Мужики, еще вопросик есть.<br /><br />Сделал я псевдохром, на кубиках, книжках, мечах и всем плоском, что вращается, он работает, а вот на наклонных и сложных плоскостях не фурычит как положено, сдвигается и скручивается в стороны.<br /><br />Проблема явно в нормалях (браши и муверы работают нормально). <br />И нормали я беру вроде как положено, из r_avertexnormals[verts-&gt;lightnormalindex][1-2-3]<br />Но они, видимо, хранятся не в абсолютных величинах, а в предрассчитанных, типа синусов/косинусов или еще чего. <br />В общем, там где у нормали два нуля и только одна координата не нулевая, все работает.<br /><br />Поэтому остается только один вопрос - как правильно преобразовать нормали, чтобы выйти на реальный правильный вектор нормали к каждой плоскости? <br />Накапливать вершины в цикле построения GL_TRIANGLE_FAN и каждый раз строить и перемножать получившиеся вектора как-то уж совсем через жопу - первые две нормали вообще левые будут.