Direct X Rotation / C # как заставить два объекта меша всегда смотреть друг на друга - PullRequest
1 голос
/ 08 апреля 2010

Есть ли способ, заданный центральной точкой объекта сетки, чтобы он всегда находился напротив другой заданной точки? Например, если цилиндр нарисован таким образом, что у конуса всегда кончик кончика всегда обращен к какой-либо другой заданной точке?

1 Ответ

0 голосов
/ 12 апреля 2010

Ну, это определенно выполнимо.Вам необходимо установить ортонормированный базис так, чтобы 2 объекта указывали друг на друга.Я собираюсь предположить, что ваш конус настроен так, что точка находится вниз по оси Z. (Вы должны иметь это в виду).

Конус A находится в положении P
Конус B равенв положении Q

Направление от A к B равно = Q - P, а B к A - P - Q. Сначала нам нужно нормализовать оба этих вектора, чтобы они теперь были единичными векторами направления.Мы будем называть их A 'и B', соответственно, для удобства (теперь они оба являются векторами направления).

Мы можем пока предположить, что вектор вверх (назовем его U) равен0, 1, 0 (Имейте в виду, что математика здесь упадет, если A 'или B' очень близки к этому вектору вверх, но сейчас я не буду об этом беспокоиться).

Так что теперь нам нужнобоковой вектор и истинный вектор.К счастью, мы можем вычислить нечто, перпендикулярное плоскости, образованной вектором Вверх и A 'или B', используя перекрестное произведение.

Таким образом, боковой вектор (S) рассчитывается следующим образом ... A 'xU. Теперь у нас есть этот побочный вектор, который мы можем вычислить истинный вектор Up, выполнив A 'x S. Теперь мы получим 3 вектора, которые нам нужны для ортонормированного базиса.Вы можете нормализовать эти 2 вектора, чтобы удалить любые ошибки, которые могли накопиться, но перекрестное произведение 2-х единичных векторов всегда должно быть единичным вектором, поэтому любые ошибки будут незначительными, поэтому, вероятно, это не стоит делать.

Использование этой информацииТеперь мы можем построить матрицу для Конуса A.

S.x,  S.y,  S.z,  0
U.x,  U.y,  U.z,  0
A'.x, A'.y, A'.z, 0
P.x, P.y, P.z, 1

Выполните те же вычисления для обоих конусов, и теперь они будут указывать друг на друга.Если вы переместите любой конус, пересчитайте, как указано выше, снова для обоих колбочек, и они все равно будут указывать друг на друга.

Стоит отметить, что используемый мной матричный формат является макетом DirectX по умолчанию (основной ряд).Вполне возможно, что C # (и, следовательно, XNA?) Использует основной формат столбца.Если это так, вам нужно выложить значения следующим образом:

S.x, U.x, A'.x, P.x
S.y, U.y, A'.y, P.y
S.z, U.z, A'.z, P.z
0,   0,   0,    1

Обратите внимание, что единственная разница между двумя матрицами заключается в том, что строки и столбцы поменялись местами.Это делает вторую матрицу транспонированной 1-й матрицы (и наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...