Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 24.02.2006, 09:16   #16
Conan Fedr
Нуждающийся
 
Регистрация: 08.02.2006
Сообщений: 75
Написано 0 полезных сообщений
(для 0 пользователей)
Вот может кому нада либа с сайта Матвея Меркулов для перещета кватернионов и углов Эйлера и еще для чегото

; Quat.bb : v1.0 : 15/11/02

; A tutorial on how to use this file is at http://www.dscho.co.uk/blitz/tutorials/quaternions.shtml

; Types
Type Rotation
	Field pitch#, yaw#, roll#
End Type

Type Quat
	Field w#, x#, y#, z#
End Type

; Change these constants if you notice slips in accuracy
Const QuatToEulerAccuracy# = 0.001
Const QuatSlerpAccuracy#  = 0.0001

; convert a Rotation to a Quat
Function EulerToQuat(out.Quat, src.Rotation)
; NB roll is inverted due to change in handedness of coordinate systems
	Local cr# = Cos(-src\roll/2)
	Local cp# = Cos(src\pitch/2)
	Local cy# = Cos(src\yaw/2)

	Local sr# = Sin(-src\roll/2)
	Local sp# = Sin(src\pitch/2)
	Local sy# = Sin(src\yaw/2)

; These variables are only here to cut down on the number of multiplications
	Local cpcy# = cp * cy
	Local spsy# = sp * sy
	Local spcy# = sp * cy
	Local cpsy# = cp * sy

; Generate the output quat
	out\w = cr * cpcy + sr * spsy
	out\x = sr * cpcy - cr * spsy
	out\y = cr * spcy + sr * cpsy
	out\z = cr * cpsy - sr * spcy
End Function

; convert a Quat to a Rotation
Function QuatToEuler(out.Rotation, src.Quat)
	Local sint#, cost#, sinv#, cosv#, sinf#, cosf#
	Local cost_temp#

	sint = (2 * src\w * src\y) - (2 * src\x * src\z)
	cost_temp = 1.0 - (sint * sint)

	If Abs(cost_temp) > QuatToEulerAccuracy
 cost = Sqr(cost_temp)
	Else
 cost = 0
	EndIf

	If Abs(cost) > QuatToEulerAccuracy
 sinv = ((2 * src\y * src\z) + (2 * src\w * src\x)) / cost
 cosv = (1 - (2 * src\x * src\x) - (2 * src\y * src\y)) / cost
 sinf = ((2 * src\x * src\y) + (2 * src\w * src\z)) / cost
 cosf = (1 - (2 * src\y * src\y) - (2 * src\z * src\z)) / cost
	Else
 sinv = (2 * src\w * src\x) - (2 * src\y * src\z)
 cosv = 1 - (2 * src\x * src\x) - (2 * src\z * src\z)
 sinf = 0
 cosf = 1
	EndIf

; Generate the output rotation
	out\roll = -ATan2(sinv, cosv); inverted due to change in handedness of coordinate system
	out\pitch = ATan2(sint, cost)
	out\yaw = ATan2(sinf, cosf)
End Function

; use this to interpolate between quaternions
Function QuatSlerp(res.Quat, start.Quat, fin.Quat, t#)
	Local scaler_w#, scaler_x#, scaler_y#, scaler_z#
	Local omega#, cosom#, sinom#, scale0#, scale1#

	cosom = start\x * fin\x + start\y * fin\y + start\z * fin\z + start\w * fin\w

	If cosom <= 0.0
 cosom = -cosom
 scaler_w = -fin\w
 scaler_x = -fin\x
 scaler_y = -fin\y
 scaler_z = -fin\z
	Else
 scaler_w = fin\w
 scaler_x = fin\x
 scaler_y = fin\y
 scaler_z = fin\z
	EndIf

	If (1 - cosom) > QuatSlerpAccuracy
 omega = ACos(cosom)
 sinom = Sin(omega)
 scale0 = Sin((1 - t) * omega) / sinom
 scale1 = Sin(t * omega) / sinom
	Else
	; Angle too small: use linear interpolation instead
 scale0 = 1 - t
 scale1 = t
	EndIf

	res\x = scale0 * start\x + scale1 * scaler_x
	res\y = scale0 * start\y + scale1 * scaler_y
	res\z = scale0 * start\z + scale1 * scaler_z
	res\w = scale0 * start\w + scale1 * scaler_w
End Function

; result will be the same rotation as doing q1 then q2 (order matters!)
Function MultiplyQuat(result.Quat, q1.Quat, q2.Quat)
	Local a#, b#, c#, d#, e#, f#, g#, h#

	a = (q1\w + q1\x) * (q2\w + q2\x)
	b = (q1\z - q1\y) * (q2\y - q2\z)
	c = (q1\w - q1\x) * (q2\y + q2\z)
	d = (q1\y + q1\z) * (q2\w - q2\x)
	e = (q1\x + q1\z) * (q2\x + q2\y)
	f = (q1\x - q1\z) * (q2\x - q2\y)
	g = (q1\w + q1\y) * (q2\w - q2\z)
	h = (q1\w - q1\y) * (q2\w + q2\z)

	result\w = b + (-e - f + g + h) / 2
	result\x = a - ( e + f + g + h) / 2
	result\y = c + ( e - f + g - h) / 2
	result\z = d + ( e - f - g + h) / 2
End Function

; convenience function to fill in a rotation structure
Function FillRotation(r.Rotation, pitch#, yaw#, roll#)
	r\pitch = pitch
	r\yaw = yaw
	r\roll = roll
End Function
(Offline)
 
Ответить с цитированием
Старый 24.02.2006, 12:45   #17
Maxus
ПроЭктировщик
 
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений
(для 36 пользователей)
Originally posted by Conan Fedr@24.2.2006, 9:16
Вот может кому нада либа с сайта Матвея Меркулов для перещета кватернионов и углов Эйлера и еще для чегото
А вот это уже интереснее...
(Offline)
 
Ответить с цитированием
Старый 16.06.2011, 16:28   #18
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

скажите, можно как-то задать кватерниону 3д вектор направление и угол?
т.е. что-то типа задания матрице dir и up, но вместо up угол.
п.с. ни в одной статье не видел, чтобы описывалось что такое кватернион т.е. как влияют его числа на ориентацию и как его можно представить в 3д пространстве. с матрицей это действительно просто. 3 вектора задающие направление и размер осей модели и вектора - позиция.
(Offline)
 
Ответить с цитированием
Старый 16.06.2011, 16:50   #19
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

q = [ V*sin(alpha/2), cos(alpha/2) ]
http://www.gamedev.ru/articles/?id=30129
(Offline)
 
Ответить с цитированием
Старый 16.06.2011, 18:18   #20
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

Mr_F_, чот не получается. вообще эта формула задает угол поворота вокруг вектора.
Мне надо сделать след от выстрела. для этого надо, чтобы Z-вектор матрицы спрайта смотрел в сторону нормали.
матрицами я это так делаю:
Vector3f dir = new Vector3f(nx, ny, nz); //нормаль
Vector3f up = null;
if(Math.abs(dir.y) < 0.5f ) {
up = new Vector3f(0, 1, 0);
} else { // если нормаль смотрит вверх или вниз
up = new Vector3f(1, 0, 0);
}
matrix.lookAt(dir, up); //задаем dir, up, вычисляем side и выравниваем up.
Все просто. но интересно как это кватернионом сделать. видь с ним не надо находить вектор up.
(Offline)
 
Ответить с цитированием
Старый 17.06.2011, 13:36   #21
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

Правильно ли я понимаю?

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

Т.е. под этим термином понимается сведение этих операций в одну формулу?
(Offline)
 
Ответить с цитированием
Старый 17.06.2011, 13:36   #22
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

Правильно ли я понимаю?

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

Т.е. под этим термином понимается сведение этих операций в одну формулу?
(Offline)
 
Ответить с цитированием
Старый 17.06.2011, 23:56   #23
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Кватернионы мать их :) вернее отца :)

реквестируются мегаматематики в тред, т.к. я кватернионолох и ничего лучше с ними делать, чем копипастить из разных мест, пока они не заработают, делать не умею)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оброзование мать его!!! ЛысыЙ_Чук-Иванчук Болтовня 35 03.11.2007 19:00
Анимация мать её.. vadya Blitz3D 3 30.06.2007 02:44


Часовой пояс GMT +4, время: 07:21.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com