28.02.2006, 18:52
Вижу что это давно обсуждалось сам занят разработкой cam едитора , но у меня возникли нсколько проблем ( я пишу на Blitz3D ибо на нем 3д делать просто , следственно у меня 3д cam едитор ) вообщем при чтении самого большего файла с камерами получается деформированный овал из камер ( я так предполагаю это границы камеры на базе ) но они расположены перпендикулярно плоскости , меня это почемуто настораживает . возможно в кам файле координаты хранятся не в прямом порядке ? Ну и насчет кватернионов , опятьже непонятно как они хранятся XYZW или WXYZ или еще как нибудь .
Кому интересно вот библа , для Blitz3D Которая переводит кватернионы в углы эйлера и обратно ( тут нарисовывается проблема в том что в углах эйлера важены не только координаты угла , но и то в каком порядке поворачивается обьект )
Вот код :
PS Думаю понять его будет нетрудно так как это проктически обычный бейзик .
Забыл в предыдущем посте написать ник вообщем если сможете чем помочь или может я смогу вам чем помочь вот мои контакты
ICQ 272529694
mail conan_fedr_666@mail.ru
MSN conan_fedr_666@mail.ru
Вообщем вотЪ мне нужна помощь , мой кам вьюер очень глючный , несчитая того что я возможно неправельно пересчитываю координаты , он еще почемуто все камы кроме самого большего несовсем правельно отображает в плане того что видна лиш одна камер , я незнаю изза чего это хотя сбоку в меню отображаются что камер 9 или больше в зависимости от файла , очень странное явление .
Вообщем вот мой исходник , тут используются либы quaternions опубликованная выше и XUI2 либа интерфейса . Прошу вас посмотреть и порекомендовать все что можно от координат и угла до того как правельнее организовать интерфейс и глючащих камер . Также я прилагаю архив в котором скомпилиная прога со всем необходимым , извините правда она неудобная очень я ее очень мало писал буквально пару часов . Чтобы подгрузить в нее какойнить файл нада в блокнотике который идет с ней написать имя этого файла с расширением ессесно cam , положить этот файл в папку с прогой и запустить программу , да еще необходим DirectX не меньше 7 версии . Вот все вообщем
Исходник :
Блиин у вас низя гостям циплять файлы , ну лана закачаю на фтп ...
Вот сцылко на архив с прогой : http://www.cool.hut1.ru/XUI2_Demo_Release_05-08-20.rar
PS Очень нужна помощь
Опять забыл написать кнопки для управления :
W - поворот камеры вверх
S - поворот камеры вниз
Up - Передвежение камеры вперед
Down - Передвежение камеры назад
Left - поворот камеры в лево
Right - поворот камеры в право
Alt + Left Mouse Button - Произвольное вращение камеры
Кому интересно вот библа , для Blitz3D Которая переводит кватернионы в углы эйлера и обратно ( тут нарисовывается проблема в том что в углах эйлера важены не только координаты угла , но и то в каком порядке поворачивается обьект )
Вот код :
Код:
; 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(-srcroll/2)
Local cp# = Cos(srcpitch/2)
Local cy# = Cos(srcyaw/2)
Local sr# = Sin(-srcroll/2)
Local sp# = Sin(srcpitch/2)
Local sy# = Sin(srcyaw/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
outw = cr * cpcy + sr * spsy
outx = sr * cpcy - cr * spsy
outy = cr * spcy + sr * cpsy
outz = 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 * srcw * srcy) - (2 * srcx * srcz)
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 * srcy * srcz) + (2 * srcw * srcx)) / cost
cosv = (1 - (2 * srcx * srcx) - (2 * srcy * srcy)) / cost
sinf = ((2 * srcx * srcy) + (2 * srcw * srcz)) / cost
cosf = (1 - (2 * srcy * srcy) - (2 * srcz * srcz)) / cost
Else
sinv = (2 * srcw * srcx) - (2 * srcy * srcz)
cosv = 1 - (2 * srcx * srcx) - (2 * srcz * srcz)
sinf = 0
cosf = 1
EndIf
; Generate the output rotation
outroll = -ATan2(sinv, cosv); inverted due to change in handedness of coordinate system
outpitch = ATan2(sint, cost)
outyaw = 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 = startx * finx + starty * finy + startz * finz + startw * finw
If cosom <= 0.0
cosom = -cosom
scaler_w = -finw
scaler_x = -finx
scaler_y = -finy
scaler_z = -finz
Else
scaler_w = finw
scaler_x = finx
scaler_y = finy
scaler_z = finz
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
resx = scale0 * startx + scale1 * scaler_x
resy = scale0 * starty + scale1 * scaler_y
resz = scale0 * startz + scale1 * scaler_z
resw = scale0 * startw + 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 = (q1w + q1x) * (q2w + q2x)
b = (q1z - q1y) * (q2y - q2z)
c = (q1w - q1x) * (q2y + q2z)
d = (q1y + q1z) * (q2w - q2x)
e = (q1x + q1z) * (q2x + q2y)
f = (q1x - q1z) * (q2x - q2y)
g = (q1w + q1y) * (q2w - q2z)
h = (q1w - q1y) * (q2w + q2z)
resultw = b + (-e - f + g + h) / 2
resultx = a - ( e + f + g + h) / 2
resulty = c + ( e - f + g - h) / 2
resultz = d + ( e - f - g + h) / 2
End Function
; convenience function to fill in a rotation structure
Function FillRotation(r.Rotation, pitch#, yaw#, roll#)
rpitch = pitch
ryaw = yaw
rroll = roll
End Function
PS Думаю понять его будет нетрудно так как это проктически обычный бейзик .
Забыл в предыдущем посте написать ник вообщем если сможете чем помочь или может я смогу вам чем помочь вот мои контакты
ICQ 272529694
mail conan_fedr_666@mail.ru
MSN conan_fedr_666@mail.ru
Вообщем вотЪ мне нужна помощь , мой кам вьюер очень глючный , несчитая того что я возможно неправельно пересчитываю координаты , он еще почемуто все камы кроме самого большего несовсем правельно отображает в плане того что видна лиш одна камер , я незнаю изза чего это хотя сбоку в меню отображаются что камер 9 или больше в зависимости от файла , очень странное явление .
Вообщем вот мой исходник , тут используются либы quaternions опубликованная выше и XUI2 либа интерфейса . Прошу вас посмотреть и порекомендовать все что можно от координат и угла до того как правельнее организовать интерфейс и глючащих камер . Также я прилагаю архив в котором скомпилиная прога со всем необходимым , извините правда она неудобная очень я ее очень мало писал буквально пару часов . Чтобы подгрузить в нее какойнить файл нада в блокнотике который идет с ней написать имя этого файла с расширением ессесно cam , положить этот файл в папку с прогой и запустить программу , да еще необходим DirectX не меньше 7 версии . Вот все вообщем
Исходник :
Код:
; Включения
Include "XUI2.bb"
Include "Quaternions.bb"
; Константы
Const APP_TITLE$ = "-$[CAMedit by Conan Fedr]$- ЛВ Delovepers Group"
; Глобальные переменные
Global tool_window%
Global tool_label_name%,tool_group_actions%
Global tool_group_zap%,tool_group_coords%,tool_list_nodes%
Global camFile%,camPiv%
; Тип записи в ListView'ве записей камеры
Type TZapNode
Field Name$
Field Node%
Field Entity%
End Type
; Тип записи камеры
Type TCamNode
Field Id$
Field Hz%
Field PosX#
Field PosY#
Field PosZ#
Field Rot.Rotation
Field CamMarker%
End Type
; Инициализация графического режима
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
HidePointer()
AppTitle(APP_TITLE)
; Инициализация интерфейса
XUI2_Init("XUI2_SKINSXUI2_WINXP_LUNA_S.xuiskin",True,False,True,"ENG")
XUI2_InitWindowSnap(True,5)
; Построение шаблона сцены
SceneGrid = LoadMesh("grid.b3d")
Global CameraMarker = LoadMesh("cam_marker.3ds")
ScaleEntity CameraMarker,0.3,0.3,0.3
HideEntity(CameraMarker)
Global Camera = CreateCamera()
PositionEntity Camera,0,5,0
CameraClsColor Camera,50,150,255
Light = CreateLight()
; Вызовы пользовательских функций
CreateInterface()
hzname = OpenFile("filename.txt")
ReadCam(ReadLine(hzname))
CloseFile(hzname)
; Основной цикл
Repeat
Cls
If KeyDown(200) Then MoveEntity Camera,0,0,1
If KeyDown(208) Then MoveEntity Camera,0,0,-1
If KeyDown(203) Then TurnEntity Camera,0,1,0
If KeyDown(205) Then TurnEntity Camera,0,-1,0
If KeyDown(17) Then TurnEntity Camera,-1,0,0
If KeyDown(31) Then TurnEntity Camera,1,0,0
UseCamera()
UpdateWorld
;WireFrame 1
RenderWorld
XUI2_Update()
;------------------------------
If MouseDown(1) Then ClickedEntity = CameraPick(Camera,MouseX(),MouseY())
For CN.TCamNode = Each TCamNode
If CNCamMarker = ClickedEntity
info_pos$ = CNPosX + " " + CNPosY + " " + CNPosZ
info_rot$ = CNRotPitch + " " + CNRotYaw + " " + CNRotRoll
info_time$ = CNId
Exit
EndIf
Next
Text 220,20,"Mouse X : "+MouseX()+" Mouse Y : "+MouseY()
Text 220,30,"Picked Entity : "+PickedEntity()
Text 220,40,"Info : Position : "+info_pos
Text 220,50," Rotation : "+info_rot
Text 220,60," Time : "+info_time
If KeyDown(1) Exit
Flip
Forever
; Функция создания интерфейса
Function CreateInterface()
; Окно инструментов
tool_window = XUI2_Window(0,0,200,600,"-$[Tools]$-","",0,1+4)
tool_label_name = XUI2_Label(tool_window,87,10,"Tools",4,1)
tool_group_zap = XUI2_GroupBox(tool_window,10,30,180,200,".cam Nodes",0,0)
tool_list_nodes = XUI2_ListView(tool_group_zap,10,10,90,170,"Bla!",4,"LIST",1,1,"hz")
;tool_button_nodes_select = XUI2_Button(tool_group_zap,10,160,75,20,"Select","hz")
;tool_button_nodes_select = XUI2_Button(tool_group_zap,95,160,75,20,"Cansel","hz")
tool_group_coords = XUI2_GroupBox(tool_window,10,230,180,250,"Coordinates",0,0)
tool_group_actions = XUI2_GroupBox(tool_window,10,480,180,110,"Actions",0,0)
End Function
; Функция чтения cam файла
Function ReadCam(filename$)
Local SizFile%
camFile = OpenFile(filename)
SizFile = FileSize(filename)
For i = 1 To SizFile / 36
CamNode.TCamNode = New TCamNode
ZapNode.TZapNode = New TZapNode
CamNodeRot.Rotation = New Rotation
Quatr.Quat = New Quat
CamNodeId = FRead()
CamNodeHz = IRead()
CamNodePosX = FRead()
CamNodePosY = FRead()
CamNodePosZ = FRead()
Quatrx = FRead()
Quatry = FRead()
Quatrz = FRead()
Quatrw = FRead()
CamNodeCamMarker = CopyEntity(CameraMarker)
PositionEntity CamNodeCamMarker,CamNodePosX,CamNodePosY,CamNodePosZ
QuatToEuler(CamNodeRot,Quatr)
RotateEntity CamNodeCamMarker,CamNodeRotPitch,CamNodeRotyaw,CamNodeRotroll
EntityPickMode CamNodeCamMarker,2
ZapNodeName = "Запись "+i
ZapNodeNode = XUI2_ListItem(tool_list_nodes,ZapNodeName)
ZapNodeEntity = CamNodeCamMarker
;Delete Quatr
;Delete CamNode
Next
End Function
; Функция чтения float'a
Function FRead#()
Return ReadFloat(camFile)
End Function
; Функция чтения int'a
Function IRead%()
Return ReadInt(camFile)
End Function
Function UseCamera()
If MouseDown(1) And KeyDown(56)
TurnEntity Camera, MouseYSpeed(),0,0
TurnEntity Camera, 0,-MouseXSpeed(),0,1
;MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
EndIf
If MouseZSpeed() = 1
MoveEntity Camera,0,0,-3
EndIf
If MouseZSpeed() = -1
MoveEntity Camera,0,0,3
EndIf
End Function
Блиин у вас низя гостям циплять файлы , ну лана закачаю на фтп ...
Вот сцылко на архив с прогой : http://www.cool.hut1.ru/XUI2_Demo_Release_05-08-20.rar
PS Очень нужна помощь
Опять забыл написать кнопки для управления :
W - поворот камеры вверх
S - поворот камеры вниз
Up - Передвежение камеры вперед
Down - Передвежение камеры назад
Left - поворот камеры в лево
Right - поворот камеры в право
Alt + Left Mouse Button - Произвольное вращение камеры