forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Трабла с подгрузкой координат из файла (http://forum.boolean.name/showthread.php?t=708)

Conan Fedr 24.02.2006 07:46

Вообщем я файл состоит из записей в которых хранится угол и координаты камеры я подгружаю и все это в кучу слепливается :( . Координаты вроде подгружаются проверял RuntimeError'ом :) . Возможно я что-то нетак с типами делаю ...

Вот скрин :


Вот кусок код
Код:

; ------------ Функция подгрузки из cam'а
Function ReadCam(filename$)
        Local SizFile%
        camFile = OpenFile(filename)
        SizFile = FileSize(filename)
       
        For i = 1 To SizFile / 36
 *CamNode.TCamNode = New TCamNode
 *CamNode\Rot.Rotation = New Rotation
 *Quatr.Quat = New Quat
 *CamNode\Id = IRead()
 *CamNode\Hz = IRead()
 *CamNode\PosX = FRead()
 *CamNode\PosY = FRead()
 *CamNode\PosZ = FRead()
 *Quatr\x = FRead()
 *Quatr\y = FRead()
 *Quatr\z = FRead()
 *Quatr\w = FRead()

 *CamNode\CamMarker = CopyEntity(CameraMarker)
 *PositionEntity CamNode\CamMarker,CamNode\PosX/10,CamNode\PosY/10,CamNode\PosZ/10
 *QuatToEuler(CamNode\Rot,Quatr)
 *RotateEntity CamNode\CamMarker,CamNode\Rot\Pitch,CamNode\Rot\yaw,CamNode\Rot\roll
 *Delete Quatr
 *Delete CamNode
        Next
End Function

Фнукции FRead() и IRead() Читают из файла Float и Int соответственно :). Памагити :) :o''

Conan Fedr 24.02.2006 07:53

И еще кое что раз уже начал задавать вопросы :) как убрать эйджи которые делят 4вертексные полигоны на триугольники .

Conan Fedr 24.02.2006 08:34

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

Guest 24.02.2006 12:01

Насчет сетки - рендер вручную, линиями. Либо квад с альфа-тексой затайленой.
Да, ошибка может быть в несоответствии алгоритма сохранения и загрузки, округления флоата вследствие юзанья целого, несоотвествие структур.

Maxus 24.02.2006 12:48

Цитата:

Originally posted by Guest@24.2.2006, 12:01
Насчет сетки - рендер вручную, линиями. Либо квад с альфа-тексой затайленой.
Да, ошибка может быть в несоответствии алгоритма сохранения и загрузки, округления флоата вследствие юзанья целого, несоотвествие структур.

Покажи данные которые ты читаешь из файла в живую...

Guest 24.02.2006 16:10

Цитата:

Покажи данные которые ты читаешь из файла в живую...

Ты это мне?
Я Платон , если что:)))

pax 24.02.2006 16:58

А зачем ты сначала создаешь объект в типе:
[blitz] CamNode\CamMarker = CopyEntity(CameraMarker)[/blitz]

а потом удаляешь сам тип оставляя объет
[blitz]Delete CamNode[/blitz]

хэндл объекта ты точно потерял...

pax 24.02.2006 17:06

И еще спросить хотел, почему ты не пользуешься стандартными функциями чтения из файла?

[blitz]ReadInt (filehandle/stream)
ReadFloat (filehandle/stream)[/blitz]

к тому же я не понял из какого файла ты данные читаешь :dontknow:

еще убедись что:
[blitz]FRead()[/blitz]
объявлена как:
[blitz]FRead#()[/blitz]

Conan Fedr 24.02.2006 19:46

Щя выложу полный код , а пока структура файла :
Файл состоит из записей , каждая размером по 36 байт , запись делится на 9 полей по 4 байта
1 4байта - ID
2 4байта - я точно незнаю но это и ненужно :)
3,4,5 4байта - XYZ положение
6,7,8,9 4 байт - Угол XYZW ( в кватернионах )

2PAX
Я пока неочень понял как типы работают . Напиши пожалуйста как исправить это дело .

Вот код :
Код:

; Включения
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%
Global camFile%,camPiv%

; Тип записи камеры
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_SKINS\XUI2_WINXP_LUNA_S.xuiskin",True,False,True,"ENG")
XUI2_InitWindowSnap(True,5)

; Построение шаблона сцены
SceneGrid = LoadMesh("grid.3ds")

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()
ReadCam("test.cam")

; Основной цикл
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()

        Text 220,20,"Mouse X : "+MouseX()+" Mouse Y : "+MouseY()
        Text 220,30,"Picked Entity : "+PickedEntity()
       
        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_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
 CamNode\Rot.Rotation = New Rotation
 Quatr.Quat = New Quat
 CamNode\Id = IRead()
 CamNode\Hz = IRead()
 CamNode\PosX = FRead()
 CamNode\PosY = FRead()
 CamNode\PosZ = FRead()
 Quatr\x = FRead()
 Quatr\y = FRead()
 Quatr\z = FRead()
 Quatr\w = FRead()

 CamNode\CamMarker = CopyEntity(CameraMarker)
 PositionEntity CamNode\CamMarker,CamNode\PosX,CamNode\PosY,CamNode\PosZ
 QuatToEuler(CamNode\Rot,Quatr)
 RotateEntity CamNode\CamMarker,CamNode\Rot\yaw,CamNode\Rot\roll,CamNode\Rot\Pitch
 EntityPickMode CamNode\CamMarker,2
 Delete Quatr
 Delete CamNode
        Next
;RuntimeError(i)
End Function

; Функция чтения float'a
Function FRead()
        Return ReadFloat(camFile)
End Function

; Функция чтения int'a
Function IRead()
        Return ReadInt(camFile)
End Function

Function UseCamera()
        Local ClickedEntity%
        If MouseDown(1) Then ClickedEntity = CameraPick(Camera,MouseX(),MouseY())
       
        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


pax 24.02.2006 19:51

Вот явная ошибка:
[blitz]Function FRead()
Return ReadFloat(camFile)
End Function[/blitz]

А надо
[blitz]Function FRead#()
Return ReadFloat(camFile)
End Function[/blitz]

остальное посмотрю, скинь файл для тестов который ты загружаешь

pax 24.02.2006 19:58

Совет: не используй глобальные переменные там где можно обойтись без них.
Функцию чтения можно написать так:
[blitz]; Функция чтения cam файла
Function ReadCam(filename$)
Local camFile% = OpenFile(filename)
Local SizFile% = FileSize(filename)

For i = 1 To SizFile / 36
CamNode.TCamNode = New TCamNode
CamNode\Rot.Rotation = New Rotation
Quatr.Quat = New Quat
CamNode\Id = ReadInt(camFile)
CamNode\Hz = ReadInt(camFile)
CamNode\PosX = ReadFloat(camFile)
CamNode\PosY = ReadFloat(camFile)
CamNode\PosZ = ReadFloat(camFile)
Quatr\x = ReadFloat(camFile)
Quatr\y = ReadFloat(camFile)
Quatr\z = ReadFloat(camFile)
Quatr\w = ReadFloat(camFile)

CamNode\CamMarker = CopyEntity(CameraMarker)
PositionEntity CamNode\CamMarker,CamNode\PosX,CamNode\PosY,CamNod e\PosZ
QuatToEuler(CamNode\Rot,Quatr)
RotateEntity CamNode\CamMarker,CamNode\Rot\yaw,CamNode\Rot\roll ,CamNode\Rot\Pitch
EntityPickMode CamNode\CamMarker,2
Delete Quatr
Delete CamNode ;Подумай стоит ли удалять этот объект
Next
;RuntimeError(i)
End Function[/blitz]

типы ы Blitz'е это теже структуры как и в C++, за исключением некоторых возможностей...

Conan Fedr 24.02.2006 20:23

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

PAX спасибо .

Conan Fedr 24.02.2006 22:31

Вложений: 2
Такс вот 2 файла , в том который мало весит 9 записей но отображается почемуто только одна камера хотя у других координаты тоже нормальные.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot