Войти
ПрограммированиеФорумОбщее

Математика компьютерной игры (4 стр)

Страницы: 1 2 3 4 5 Следующая »
#45
11:09, 9 окт. 2011

Zefick
sin() и cos() принимают угол в радианах. Я же в функцию угол задаю в градусах (извиняюсь что в посте 42 написал Цельсии). Из градусов в радианы переводится:

радианы = градусы * ( Пи / 180 )

Я же использую макрос D3DX для перевода из градусов в радианы D3DXToRadian(). И не понимаю почему получаются такие значения.


#46
11:22, 9 окт. 2011

s3dworld
> И не понимаю почему получаются такие значения.
Блин, это печально. Почитай про экспоненциальную запись числа, машинную точность и т.п.

#47
13:43, 9 окт. 2011
чтобы камеру нужно было поворачивать от градусов по Цельсию

AFAIK градусная мера придумана в Древней Греции и Цельсий тут ни причём :)
#48
14:44, 9 окт. 2011

s3dworld
Ты пытаешься температуру в угол перевести?)))))

#49
14:48, 9 окт. 2011

Никто не читает что я пишу?

Для кого я написал в посте #45?
> (извиняюсь что в посте 42 написал Цельсии)

#50
16:14, 9 окт. 2011

s3dworld
А сам то читаешь, что тебе пишут и советуют? Почитай про хранение чисел с плавающей точкой, IEEE 754, сравнения таких чисел и прочее. И вообще, сколько можно задавать таких глупых вопросов, ответы на которые можно найти и самому за пару, а то и меньше минут?

#51
18:16, 9 окт. 2011

Sbtrn. Devil
> Векторное произведение двух векторов определено только в 3D и 7D. Увы.
Обождите пару часов, по-моему на викизаборе бред опять написан. Я сейчас открою серьёзный учебник и посмотрю. Суть векторного произведения заключается в построении вектора, скалярное произведение которого на любой из данных равно нулю. Достигается это равенством нулю определителя матрицы при наличии в ней двух одинаковых строк. Как в семимерном пространстве будет выглядеть определитель матрицы 3 на 7, если он существует только для квадратных матриц? Никак не будет потому, что в природе не существует. Если в двух словах, то для построения в пространстве любой размерности n, надо вычислить определитель определитель матрицы n на n, в которой первая строка представлена ортонормированным базисом пространства, а остальные n-1 строк являются соответственно координатами каждого из n-1 данных векторов. Всё, я полез рыть eqworld.ipmnet.ru и exponenta.ru.

#52
23:04, 9 окт. 2011

Алексей Патрашов
Суть обобщения векторного произведения заключается в построении некоторой хитрой алгебраической операции, которая в частном случае для трёхмерных векторов даёт векторное произведение.

http://en.wikipedia.org/wiki/Grassman_algebra

Ещё одна тонкость в том, что подобное "произведение" векторов - это уже не вектор, а тензор второго ранга (а.к.а. "матрица"), который, впрочем, кососимметричен, а потому в 3D однозначно соответствует вектору.


1D, 2D, 3D и 7D приплели сюда не совсем в тему. В размерностях 2, 4, 8 можно построить алгебры с делением (комплексные числа, кватернионы Гамильтона, числа Кэли). Это теорема Фробениуса. Просто единичные кватернионы (i,j,k) при перемножении ведут себя так же, как и базис 3D-пространства в векторном произведении.

#53
23:16, 9 окт. 2011

s3dworld
>> Почему матрицы, почему умножение матриц,
Потому что проективная геометрия делает возможным линейными преобразованиями описывать и переносы/повороты, и все проекции. А линейное преобразование в некотором базисе - это матрица.

В книгах Борескова (если брать русскоязычных авторов), по-моему, вполне достаточно написано про все преобразования.

#54
23:35, 9 окт. 2011

Всем доброго позднего вечера!

Опишу Вам мою проблему, так как ничего путного в голову уже не лезет (возможно нужно поспать). Есть сцена, состоящая из кубов размером 2x2x2 и камерой. Камера может двигаться только по плоскости XZ. Расположение кубов описано в массиве blocks.

enum BlockType
{
    BlockType_Empty,
    BlockType_Wall
};

BlockType blocks[64*64];

Массив blocks заполнен значениями. Нужно сделать чтобы камера не проходила сквозь стены и при этом не останавливалась, а скользила. Для перемещения камеры используются её метод Move().

void wthCamera::Move(float _speed)
{
    vPos=wthPhysics::GetInstance()->CameraMove(vPos,vDir,_speed,wthScene::GetInstance()->GetMap());
}

Таким образом я вызываю функцию, в которую передаю текущее положение камеры, её направление и скорость перемещения, а в ответ получаю новую позицию с учётом возможного столкновения. Так же в функцию передаю указатель на карту, которая как раз содержит массив blocks.

За этот вечер уже два раза пытался разными алгоритмами (которые лезли в голову) решить данную задачу. Но оба алгоритма были неудачными (были косяки).

Подскажите, каким алгоритмом лучше решить данную задачу. Сейчас в голове летает третий алгоритм - ближайшее расстояние от точки до плоскости. Но всё таки это крайности, ведь для такой простой ситуации (плоский блочный мир) можно же как-то по проще. В общем голова не варит. Подскажите идеи, попробую сейчас же реализовать. А нет, просплюсь и завтра сам подумаю.

#55
1:10, 10 окт. 2011

Сделал. Использовал третий алгоритм в моей голове)) Почти всё отлично. Одна маленькая проблема, на стыке с ребром происходит не очень красиво. То есть когда я упираюсь в любое место кубика:

Изображение

то всё нормально, я не прохожу сквозь кубик и могу скользить. Но стоит мне подойти к ребру:

Изображение

то я на какой-то момент оказываюсь в кубике и могу даже видеть сквозь него другие кубики, но стоит сделать ещё один шаг и я тут же сдвинусь по нормали стороны кубика на положенную дистанцию.

Как исправить?

#56
1:48, 10 окт. 2011

Vinil
Если не трудно, то можно увидеть самый простой пример? Тензорное исчисление значительно выходит за пределы моего понимания и я понял только в общих чертах. Вот есть у нас два неколлинеарных вектора: (1;2;3;4) и (4;3;2;1). Требуется в четырёхмерном пространстве построить перпендикулярный им обоим вектор, а также найти их векторное произведение.
s3dworld
> Как исправить?
А дистанцию приближения камеры к стенам нельзя там никак задать? Тогда камера не будет оказываться в самом ребре угла. У меня в профиле есть ссылка на руководство, там на странице 53 показана похожая подлость и пояснено, почему она возникает. Я такое видал несколько раз, причём некоторые углы так открывались, а некоторые нет. Возможно, что причина в операциях с плавающей точкой и сравнение даёт разные результаты типа 0 и -0 с какой-то там погрешностью. Я с этим злом боролся вводя порог сравнения.

#57
13:43, 10 окт. 2011

Есть квадрат.

Изображение

Известны значения переменных x1, y1, x2 и y2. Квадрат обёрнут в невидимый квадрат.

Изображение

Значение переменной r тоже известно. Есть некая точка.

Изображение

Значения переменных pX и pY известны. В какой-то момент точка сдвинулась в определённом направлении по формуле:

Vec2 vPos(pX,pY); // Позиция точки
Vec2 vDir; // Направление движения точки
float speed; // Скорость движения точки

vPos+=vDir*speed; // Новое положение точки

При этом точке может лежать в невидимом квадрате.

Изображение

Лёгко узнать лежит ли точка в невидимом квадрате. Но если она в нём лежит, то её нужно отстранить на границу этого невидимого квадрата. Как бы это сделать? Затруднение связано с тем, что не могу определить какую грань невидимого квадрата точка пересекла. Или есть какие-то другие алгоритмы?

#58
14:06, 10 окт. 2011

s3dworld, хватит уже мусорить на форуме. Считаешь пересечение отрезка со всеми сторонами квадрата, находишь ближайшее - оно и есть то, что тебе нужно.

#59
14:11, 10 окт. 2011

slava_mib
Ок! Сейчас попробую.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.