#51
17 сентября 2010 в 22:46
Спасибо! <br /><br />А вот с нормалью какая-то ерунда выходит.<br /><br />Я пробовал использовать из входящей поверхности (msurface_t *s) s->plane->normal, потом пробовал в цикле перебирающем вершины суммировать нормаль с координатами каждой вершины, все одно ерунда выходит... Уже разные извращения пробовал :(<br /><br />
p = s->polys;<br />v = p->verts[0];<br /><br />normal[0]=s->plane->normal[0];<br />normal[1]=s->plane->normal[1];<br />normal[2]=s->plane->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<p->numverts ; i++, v+= VERTEXSIZE)<br />{<br /> //normal[0]=s->plane->normal[0]+v[0];<br /> //normal[1]=s->plane->normal[1]+v[1];<br /> //normal[2]=s->plane->normal[2]+v[2];<br /><br /> VectorSubtract (r_refdef.vieworg, v, viewer);<br /> 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 />И непонятно, где же грабли...
#52
20 сентября 2010 в 07:49
//normal[0]=s->plane->normal[0]+v[0];<br /> //normal[1]=s->plane->normal[1]+v[1];<br /> //normal[2]=s->plane->normal[2]+v[2];<br /><br />Удали. Тебе нужны нормали или от вершин - их нужно считать на загрузке карты, или от сурфа. Для начала возьми от сурфа. Только стоит учесть, что в Q2, чтобы пользовать s->plane->normal, нужно проверять, имеет ли сурф флаг SURF_PLANEBACK, и, если имеет, брать инвертированную нормаль.<br />
#53
20 сентября 2010 в 08:01
а не проще наложить текстуру как энв?
#54
20 сентября 2010 в 09:40
KRIGSSVIN - да, там я закомментил, просто когда не получалось, стал пробовать разные извращения "на авось".<br /><br />Barnes, блин, а ты оказался прав, реально проще, я повыбрасывал все GL_SPHERE_MAP и ура, оно заработало! <br />Правда я пока ни фига не понимаю, почему заработало, в Q3 как раз GL_SPHERE_MAP используется и там этот код работает.<br /><br />И еще маленький вопрос по отражениям - в Q3 стоит парсер и все параметры описаны в текстовых файлах шейдеров, поэтому из чистого сорса ничего не увидеть, но мне хочется узнать, какими комбинациями они добились блеска крутящихся единичек брони. <br />Там просто так текстуры подобраны или там что-то хитрое прописано для 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 />Меня эта страничка часто выручает, но там только по бленд.
#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 />
#56
20 сентября 2010 в 20:05
Barnes, KRIGSSVIN, спасибо за помощь, буду копать дальше
#57
08 октября 2010 в 19:13
Камрады, всем опять привет.<br /><br />Я хотел спросить про нормали. <br /><br />Как я понял, в движке для любой модели нормали вытаскиваются из предрассчитанных в anorm_dots.h по индексу нормали, в общем я их стал использовал для EnvMapping, оно конечно работает, но работает вкривь и вкось, не по правилам отражения вообще. Причем на статических брашах, где я брал нормаль от сурфа, все пучком, значит алгоритм работает, неправильно работают исходные данные.<br /><br />Все было сначала непонятно, я сперва грешил что нормали не те или вообще левые, но когда я тупо по ним отрисовал линии из нулевой точки модели, оказалось что нормали выглядят правильно, значит дело не в них а в самих координатах либо поворотах модели, и я теперь думаю что придется задействовать - углы поворота entities или надо как-то выходить на матрицу моделей (при отрисовке все выводится правильно, значит в активной матрице все отработано корректно, а проблемы возникают при расчетах вектора отражения, который использует нормаль, координату вершины и координату точки зрения). <br />Это получается, для отрисовки самих вершин ничего трогать не надо, а всех расчетов надо поворачивать и каждую вершину, и каждую нормаль. <br />Вот и вопрос - откуда лучше брать эти самые повороты.
#58
09 октября 2010 в 04:28
Это получается, для отрисовки самих вершин ничего трогать не надо, а всех расчетов надо поворачивать и каждую вершину, и каждую нормаль.<br />гораздо оптимальнее переместить и повернуть Магомета, а не целую гору ;D<br /><br />Вот кусок кода из q2bers:<br />
vec3_t oldorg;<br /> VectorCopy(r_origin, oldorg); // сохранить координаты камеры<br /><br /> VectorSubtract (r_origin, currententity->origin, r_origin); // currententity - это текущий энтити = брашмодель<br /><br /> if (currententity->angles[0] || currententity->angles[1] || currententity->angles[2]) // Если бмодель вращается...<br /> {<br /> vec3_t temp;<br /> vec3_t forward, right, up;<br /><br /> AngleVectors (currententity->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(); // рисуем бмодель как обычно...<br /><br /> glPopMatrix ();<br /><br /> VectorCopy(oldorg, r_origin); // восстановить коориданты камеры
#60
19 октября 2010 в 14:09
Мужики, еще вопросик есть.<br /><br />Сделал я псевдохром, на кубиках, книжках, мечах и всем плоском, что вращается, он работает, а вот на наклонных и сложных плоскостях не фурычит как положено, сдвигается и скручивается в стороны.<br /><br />Проблема явно в нормалях (браши и муверы работают нормально). <br />И нормали я беру вроде как положено, из r_avertexnormals[verts->lightnormalindex][1-2-3]<br />Но они, видимо, хранятся не в абсолютных величинах, а в предрассчитанных, типа синусов/косинусов или еще чего. <br />В общем, там где у нормали два нуля и только одна координата не нулевая, все работает.<br /><br />Поэтому остается только один вопрос - как правильно преобразовать нормали, чтобы выйти на реальный правильный вектор нормали к каждой плоскости? <br />Накапливать вершины в цикле построения GL_TRIANGLE_FAN и каждый раз строить и перемножать получившиеся вектора как-то уж совсем через жопу - первые две нормали вообще левые будут.