2017-01-27 16 views
0

Я могу представить два способа создания класса Ellipse.Как описать эллипс, подходящий для 3D (геометрия, рендеринг, физика), на любом языке

В математике эллипс описывается двумя координационными точками и основной или полуосейной длиной оси.

Типичная структура будет выглядеть так:

  • focus1: Vector3D
  • focus2: Vector3D
  • semiMajorAxis: двойной
  • planeNormal: Vector3D

Однако, я нашел это будет субоптимальным, потому что 99% времени, мне действительно не нужны координационные центры.

Это сложнее выяснить, как пересекаться с линиями или лучами или выполнять проекции.

Вместо этого я представлял бы эллипс как протянутый круг вдоль вектора.

структура будет чем-то вроде этого:

  • центр: Vector3D
  • радиус: двойной
  • stretchVector: Vector3D (ось, вдоль которой применяется растяжение)
  • stretchRate: двойной
  • planeNormal: Vector3D

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

Однако я не хватает опыта в этой области, поэтому я не уверен, какой из них является:

  • легче использовать
  • быстрее вычислить (это 3D, так Я нужен хороший perfs)

EDIT: на самом деле мне нужен эллипс в гранях объема (цилиндр секции, конусные сек), а не движения. Таким образом, мое основное использование было бы раистатом или пересечением его линиями, плоскостями, кругами, другими эллипсами и т. Д.

+0

Для 3D необходимо также вектор нормали к эллипсу плоскости – MBo

+0

Также вы можете обратиться к геометрическому Tools/Wild Magic библиотеки в 'https: //www.geometrictools. com/'and book'Геометрические инструменты для Компьютерная графика', чтобы найти эффективные подходы – MBo

+0

Да, я забыл. Отредактировано;) – cronvel

ответ

1

Форма эллипса определяется длинами большой оси a и вспомогательной осью b. Далее, вероятно, неплохо определить плоскость сложения через центральную точку C и нормальный вектор n_0, нормированный на длину один. Оставшаяся вам информация - это направление большой оси. Это может быть указано только под углом к ​​строке по умолчанию в указанной плоскости, но я не знаю, как это сделать естественным и эффективным способом. Поэтому я бы решил указать вектор направления v_a основной оси. Это вводит некоторую избыточность, так как n_0 . v_a = 0 должен содержать и дополнительно |v_a| = 1 или |v_a| = a (первое условие более эффективно для ваших нужд). Вектор направления v_b второстепенной оси может быть вычислен из приведенной выше информации, но для эффективности, вероятно, предпочли бы, чтобы он был предварительно вычислен.

Alltogether один может представлять собой эллипс в 3D со следующими данными:

  • a, b: реальные значения длины обозначающей из большой и малой оси, соответственно.
  • C: 3D точка, центр эллипса
  • n_0: 3D вектор, нормальный вектор, содержащий плоскость
  • v_a, v_b: 3D векторы, обозначающие направление крупных и мелких, соответственно.

выполняя следующие условия:

  • a >= b > 0
  • |n_0| = |v_a| = |v_b| = 1
  • n_0 = v_a x v_b
  • v_a . v_b = 0

Эффективный тест пересечения теперь может быть сделано таким образом, :

  1. Вычислить точку пересечения P, например. луч с содержащей плоскостью, определяемый C и n_0.
  2. Преобразование точки пересечения P в положение канонического эллипса в 2D (в центре = (0,0), главной оси, параллельной оси x) путем вычисления P* = M . (P-C) (см. Определение матрицы 2x3 M ниже).
  3. Преобразование эллипса к окружности с радиусом b путем вычисления P** = (b/a P*_x, P*_y)
  4. Теперь P находится внутри исходного 3D-эллипса, если и только если имеет место следующее: P**_x^2 + P**_y^2 <= b^2.

Матрица преобразования M просто

/v_a_x v_b_x n_0_x \ 
\ v_a_y v_b_y n_0_y/
+0

Спасибо за ваш ответ. Пожалуйста, не могли бы вы объяснить, почему это лучше, чем определение, используя 2 координационных центра, особенно для raycasting и пересечений с линиями, плоскостями, кругами и другими эллипсами? – cronvel

+0

@cronvel Хорошо, теперь я получаю вашу актуальную проблему. см. мои добавленные подсказки. – coproc

+0

@cronvel Я добавил простой шаг за шагом тест пересечения – coproc

0

Если вы занимаетесь физикой, вам следует обратить внимание на фокус, поскольку это очень важно в такой настройке , См. orbital elements о способах описания эллипсов в таких контекстах. Вам нужна такая параметризация, если, например, вы хотите получить скорость какого-то небесного тела.

То есть, я думаю, самое простое нефизическое описание эллипса в 3d может быть следующим:

x(t) = a + cos(t) b + sin(t) c 

Здесь a позиции центра, b вектор от центра к конец большой полуоси, а c - вектор от центра до конца полуминорной оси. Вы ожидали бы, что b и c должны быть перпендикулярны друг другу, то есть иметь нулевой точечный продукт. Для t ∈ [0,2π) это даст вам все точки эллипса, и многие геометрические свойства могут быть описаны в терминах условий, которые зависят от t, поэтому вы можете решить для t.

+0

Спасибо за ваш ответ. На самом деле мне нужен эллипс как грани объема (секция цилиндра, секция конуса), а не движения. Таким образом, мое основное использование было бы raycast или пересечь его с линиями, плоскостями, кругами, другими эллипсами и т. Д. – cronvel

+0

@cronvel: кривая как лицо твердого тела звучит неправильно. У вас должна быть поверхность. Я предполагаю, что в этих случаях я бы нашел неявное описание: какое-то уравнение в * x, y, z * удовлетворено всеми точками на поверхности. – MvG

 Смежные вопросы

  • Нет связанных вопросов^_^