Математика кватерниона для вращения?

Проблема связана с тем, что тип возвращаемого значения helper является list of substitution, и некоторые из ваших совпадений не возвращают этот тип, а вместо этого тип блока. Поэтому компилятор указывает на эту ошибку.

Теперь, один из способов исправить это - вызвать исключение в этой точке.

 exception NotUnifiable;;

И заменить все строки, аналогичные:

    | TypInt, Arrow (a,b) -> print_string "Not Unifyable" 

На:

    | TypInt, Arrow (a,b) -> raise NotUnifiable

И использование унификации:

    try 
       unify ...the arguments...
    with NotUnifiable -> print "Not unifiable"

Но делать это может быть не тем, чего вы действительно хотите: как только возникает исключение, вы прекращаете все.

8
задан shoosh 18 April 2009 в 22:02
поделиться

3 ответа

Решение должно быть довольно простым и не должно требовать четвертичных.

Ось вращения, чтобы получить от От Normal1 до Normal2 должны быть ортогональны обоим, поэтому просто возьмите их векторное перекрестное произведение .

Величина вращения легко получается из их точечного произведения . Это значение | A |. | B | .cos (theta), но, поскольку два нормальных вектора должны быть нормализованы, это даст cos (theta), поэтому просто возьмите обратный косинус, чтобы получить величину вращения.

вектор и угол являются обязательными параметрами для glRotate () - нет необходимости самостоятельно вычислять фактическую матрицу вращения.

ps не забывайте, что glRotate () нуждается в угле в градусах, но нормальные функции C trig работают в радианах.

17
ответ дан 5 December 2019 в 06:24
поделиться

Кватернионы описывают вращение вокруг оси. будет вращаться вокруг оси. некоторое количество в зависимости от баланса между величиной w . и величина вектора.

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1

Например, поворачивая его так, чтобы он смотрел на положительную ось Y, вам нужно повернуть его на 90 ° вокруг оси X. Вектор будет <0, 1, 0> , а кватернион будет = <0, 0 , 1, 0> .

Чтобы повернуть фигуру от положительной оси Z к направлению вектора , вам нужно найти вектор вращения и угол поворота. Чтобы найти ось вращения, вы можете взять перекрестное произведение текущего вектора, и где вы хотите, чтобы это было.

Если он направлен к положительной оси Z, текущий вектор будет <0, 0, 1> . Если вы хотите, чтобы он был лицом , ось вращения будет <0, 0, 1> x = <-y, x , 0> , и угол будет arctan (sqrt (x ^ 2 + y ^ 2), z) . Кватернион становится

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)
3
ответ дан 5 December 2019 в 06:24
поделиться

Вращение вокруг произвольной оси: заданный угол r в радианах и единичный вектор u = ai + bj + ck или [a, b, c], определите:

q0 = cos(r/2)  
q1 = sin(r/2) a   
q2 = sin(r/2) b  
q3 = sin(r/2) c  

и построите из этих значений матрицу вращения:

   ( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3)           | 2*(q1*q3 + q0*q2)         )
Q =( 2*(q2*q1 + q0*q3)       | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1)         )
   ( 2*(q3*q1 - q0*q2)       | 2*(q3*q2 + q0*q1)           | q0^2 - q1^2 - q2^2 + q3^2 )

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

6
ответ дан 5 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: