Welcome, guest. You can be a Login или register
« Previous 1 2 Next » | All
Author
Topic title
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
Сорри модераторы, если не в тему ветки, но не знаю где осветить.
Тема imho интересна будет программистам Quake-based движков.
Проверьте код PlaneTypeForNormal:
kmquake2 last version
int PlaneTypeForNormal (const vec3_t normal)
{
if (normal[0] == 1.0)
return 0;//PLANE_X;
if (normal[1] == 1.0)
return 1;//PLANE_Y;
if (normal[2] == 1.0)
return 2;//PLANE_Z;
return 3;//PLANE_NON_AXIAL;
}
либо
quake3
[code]#define PlaneTypeForNormal(x) (x[0] == 1.0 ? PLANE_X : (x[1] == 1.0 ? PLANE_Y : (x[2] == 1.0 ? PLANE_Z : PLANE_NON_AXIAL) ) )[/code]

Дефект в том, что плоскости с нормалями типа [0, 0, -1] будут иметь PLANE_NON_AXIAL.
К сбоям в вычислениях это не ведет, но расчеты идут по сложным формулам. Оптимизация по осям не работает в половине случаях. Может изменения скорости и не заметно, но как то некрасиво это...
Предлагаю проверять компоненты заключив их в fabs, т.е. так: if (fabs(normal[0]) == 1.0)
PS: возможно стоит еще глянуть сурсы радиантов.
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
Offline
930 posts
Karma 53
Да, вот мой вариант...

void SetPlaneType (cplane_t *plane) {
if (plane->normal[0] == 0.0f) {
if (plane->normal[1] == 0.0f) {
plane->type = PLANE_Z;
return;
}
else if (plane->normal[2] == 0.0f) {
plane->type = PLANE_Y;
return;
}
}
else if (plane->normal[1] == 0.0f) {
if (plane->normal[2] == 0.0f) {
plane->type = PLANE_X;
return;
}
}

plane->type = PLANE_NON_AXIAL;
}


Отличается от
if (Q_fabs(plane->normal[0]) == 1.0)
plane->type = PLANE_X;
else if (Q_fabs(plane->normal[1]) == 1.0)
plane->type = PLANE_Y;
else if (Q_fabs(plane->normal[2]) == 1.0)
plane->type = PLANE_Z;
else
plane->type = PLANE_NON_AXIAL;

тем, что не требует вектора нормали, приведённого к единичной длине.
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
Я поправлю сурсы Ку3Берса и в Ку2Берсе сделаю проверку-пересчёт загружаемого BSP (плейны).
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
да, KRIGSSVIN, хорошая идея
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
Offline
930 posts
Karma 53
Кхм сделал пересчёт, скорости ессно это не дало особенной (хотя, по идее, должно дать что-то в скорости определения коллизий партиклей), но, в любом случае, так правильней и так должно быть. ???
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
зато жаба спокойна ;D
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
кажись так:
#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))
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
Вот-с, сделал фиксацию PlaneTypeForNormal при загрузке BSP, получил на Base1.bsp - 4914 сообщений о неверных данныз :)
Делайте выводы господа-программеры Quake-двигов
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
KRIGSSVIN
Offline
930 posts
Karma 53
Ага вот именно делаем выводы. Ф-я мной написанная отменяется, ибо:

при позитивном векторе нормали:

plane->type = 0, normal = (1, 0, 0)
p - -100, 100, 100

simple = [b]-100 - dist[/b];
dot = 1*-100 + 0*100 + 0*100 - dist = [b]-100 - dist[/b]



и при негативном:

plane->type = 0, normal = (-1, 0, 0)
p - -100, 100, 100

simple = [b]-100 - dist[/b];
dot = -1*-100 + 0*100 + 0*100 - dist = [s][b]100 - dist[/b][/s] ???


Результат разнится... Отмена топика. Остаётся лишь призыв сделать правильно. Но тогда нужно переворошить везде в ку2 этот код, а также в модах. Резюме - нафик. ;D
Берсеркер
Offline
Суровый челябинский программист
2263 posts
Karma 200
А если попробовать сменить
if (plane->type < 3)
d = p[plane->type] - plane->dist;
else
d = DotProduct (plane->normal, p) - plane->dist;

на
if (plane->type < 3)
d = p[plane->type]*plane->normal[plane->type] - plane->dist;
else
d = DotProduct (plane->normal, p) - plane->dist;

Не так много мест с таким кодом...
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
« Previous 1 2 Next » | All