Берсеркер
2319 постов
Карма: 216
#1 17 марта 2008 в 08:58
Сорри модераторы, если не в тему ветки, но не знаю где осветить.<br />Тема imho интересна будет программистам Quake-based движков.<br />Проверьте код PlaneTypeForNormal:<br />kmquake2 last version<br />int PlaneTypeForNormal (const vec3_t normal)<br />{ <br /> if (normal[0] == 1.0)&nbsp; <br /> return 0;//PLANE_X;&nbsp; <br /> if (normal[1] == 1.0)&nbsp; <br /> return 1;//PLANE_Y;&nbsp; <br /> if (normal[2] == 1.0)&nbsp; <br /> return 2;//PLANE_Z; <br /> return 3;//PLANE_NON_AXIAL; <br />} либо<br />quake3<br />#define PlaneTypeForNormal(x) (x[0] == 1.0 ? PLANE_X : (x[1] == 1.0 ? PLANE_Y : (x[2] == 1.0 ? PLANE_Z : PLANE_NON_AXIAL) ) )<br /><br />Дефект в том, что плоскости с нормалями типа [0, 0, -1] будут иметь PLANE_NON_AXIAL.<br />К сбоям в вычислениях это не ведет, но расчеты идут по сложным формулам. Оптимизация по осям не работает в половине случаях. Может изменения скорости и не заметно, но как то некрасиво это...<br />Предлагаю проверять компоненты заключив их в fabs, т.е. так: if (fabs(normal[0]) == 1.0)<br />PS: возможно стоит еще глянуть сурсы радиантов.<br />
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
930 постов
Карма: 53
#2 17 марта 2008 в 09:37
Да, вот мой вариант...<br /><br />
void SetPlaneType (cplane_t *plane) {<br /> if (plane-&gt;normal[0] == 0.0f) {<br /> if (plane-&gt;normal[1] == 0.0f) {<br /> plane-&gt;type = PLANE_Z;<br /> return;<br /> }<br /> else if (plane-&gt;normal[2] == 0.0f) {<br /> plane-&gt;type = PLANE_Y;<br /> return;<br /> }<br /> }<br /> else if (plane-&gt;normal[1] == 0.0f) {<br /> if (plane-&gt;normal[2] == 0.0f) {<br /> plane-&gt;type = PLANE_X;<br /> return;<br /> }<br /> }<br /><br /> plane-&gt;type = PLANE_NON_AXIAL;<br />}<br />
<br /><br />Отличается от <br />
if (Q_fabs(plane-&gt;normal[0]) == 1.0)<br /> plane-&gt;type = PLANE_X;<br /> else if (Q_fabs(plane-&gt;normal[1]) == 1.0)<br /> plane-&gt;type = PLANE_Y;<br /> else if (Q_fabs(plane-&gt;normal[2]) == 1.0)<br /> plane-&gt;type = PLANE_Z;<br /> else<br /> plane-&gt;type = PLANE_NON_AXIAL;<br />
<br />тем, что не требует вектора нормали, приведённого к единичной длине.
Берсеркер
2319 постов
Карма: 216
#3 17 марта 2008 в 09:40
Я поправлю сурсы Ку3Берса и в Ку2Берсе сделаю проверку-пересчёт загружаемого BSP (плейны).
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
2319 постов
Карма: 216
#4 17 марта 2008 в 09:45
да, KRIGSSVIN, хорошая идея
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
930 постов
Карма: 53
#5 17 марта 2008 в 09:59
Кхм сделал пересчёт, скорости ессно это не дало особенной (хотя, по идее, должно дать что-то в скорости определения коллизий партиклей), но, в любом случае, так правильней и так должно быть.&nbsp; ???
Берсеркер
2319 постов
Карма: 216
#6 17 марта 2008 в 11:09
зато жаба спокойна&nbsp; ;D
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
2319 постов
Карма: 216
#7 17 марта 2008 в 11:20
кажись так:<br />#define PlaneTypeForNormal(x) (x[0] == 0.0f ? (x[1] == 0.0f ? PLANE_Z : (x[2] == 0.0f ? PLANE_Y : PLANE_NON_AXIAL)) : (x[1] == 0.0f ? PLANE_X : PLANE_NON_AXIAL))<br />
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
2319 постов
Карма: 216
#8 17 марта 2008 в 17:12
Вот-с, сделал фиксацию PlaneTypeForNormal при загрузке BSP, получил на Base1.bsp - 4914 сообщений о неверных данныз&nbsp; :)<br />Делайте выводы господа-программеры Quake-двигов
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
930 постов
Карма: 53
#9 17 марта 2008 в 18:38
Ага вот именно делаем выводы. Ф-я мной написанная отменяется, ибо:<br /><br /> при позитивном векторе нормали:<br /><br />plane-&gt;type = 0, normal = (1, 0, 0)<br />p - -100, 100, 100<br /><br />simple = [b]-100 - dist[/b];<br />dot&nbsp; &nbsp; = 1*-100 + 0*100 + 0*100 - dist = [b]-100 - dist[/b]<br /><br /><br /><br /> и при негативном:<br /><br />plane-&gt;type = 0, normal = (-1, 0, 0)<br />p - -100, 100, 100<br /><br />simple = [b]-100 - dist[/b];<br />dot&nbsp; &nbsp; = -1*-100 + 0*100 + 0*100 - dist = [s][b]100 - dist[/b][/s]&nbsp; ???<br /><br />Результат разнится... Отмена топика. Остаётся лишь призыв сделать правильно. Но тогда нужно переворошить везде в ку2 этот код, а также в модах. Резюме - нафик.&nbsp; ;D<br />
Берсеркер
2319 постов
Карма: 216
#10 17 марта 2008 в 18:48
А если попробовать сменить <br />if (plane-&gt;type &lt; 3)<br /> d = p[plane-&gt;type] - plane-&gt;dist;<br />else<br /> d = DotProduct (plane-&gt;normal, p) - plane-&gt;dist;<br />на<br />if (plane-&gt;type &lt; 3)<br /> d = p[plane-&gt;type]*plane-&gt;normal[plane-&gt;type] - plane-&gt;dist;<br />else<br /> d = DotProduct (plane-&gt;normal, p) - plane-&gt;dist;<br />Не так много мест с таким кодом...
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.