purebasic.info

PureBasic forum
Текущее время: Чт янв 18, 2018 6:45 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: импорт 3ds формата
СообщениеДобавлено: Вт июл 22, 2014 4:27 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#CameraSpeed = 1
 
IncludeFile "Screen3DRequester.pb"
 
Structure MyVertex
  x.f : y.f : z.f
  nx.f : ny.f : nz.f
  Color.l
  u.f : v.f
EndStructure
Structure FTriangle
  f1.w
  f2.w
  f3.w
EndStructure
 
Global count_Vertex.w,count_Triangle.w,chunk_id,chunk_len.l,Version.l
Global NewList TexturName.s(),NewList ModelName.s()
Global NewList vertX.f(),NewList vertY.f(),NewList vertZ.f()
Global NewList vertNX.f(),NewList vertNY.f(),NewList vertNZ.f()
Global NewList u.f(),NewList v.f()
Global NewList faceV1.w(),NewList faceV2.w(),NewList faceV3.w()
 
Procedure.l DataMesh( Mesh.l , FileName.s )
  Color.l = $FFFFFF
  If FileName.s
   
    If ReadFile(0, FileName)
     
      While Eof(0) = 0
        chunk_id  = ReadWord(0) & $FFFF
        chunk_len.l = ReadLong(0)
        ;Debug "chunk_id="+Hex(chunk_id)+"  chunk_len="+chunk_len
       
        Select chunk_id
          Case $4D4D ;Main chunk
          Case $0002:Version=ReadLong(0) ;3DS-Version
          Case $3D3D ;  3D editor chunk
          Case $AFFF ; Material exist              
          Case $10 :FileSeek(0,Loc(0)+12) ; * 0010 - RGB Color, float size 4,4,4
          Case $11 :FileSeek(0,Loc(0)+3) ; * 0011 - RGB Color - 24 bit, 3 x Byte
          Case $A010 ; Ambient color
          Case $A020 ; Diffuse color
          Case $A030 ; Specular color
          Case $A040 ; Material shininess percent
          Case $A041 ; Material shininess strength percent
          Case $A200 ; Material texture map
           
           
          Case $A300 ; Mapping filename
            Texturname_.s = ReadString(0)
            AddElement(TexturName()) : TexturName() = Texturname_
           
            If Len(Texturname_)<1
              CreateTexture(Mesh, 2, 2)
              StartDrawing(TextureOutput(Mesh))
              Box(0, 0, 2, 2, RGB(255,255,255))
              StopDrawing()
              CreateMaterial(Mesh, TextureID(Mesh))
            EndIf
           
          ;Case $A353
            ; FileSeek(0,Loc(0)+2)
            ;*USCALE=ReadFloat(0)
            ;*VSCALE=ReadFloat(0)
            ;*UOFFSET=ReadFloat(0)
            ;*VOFFSET=ReadFloat(0)
            ;*ANG=ReadFloat(0)
            ;Debug "scaleUV="+*USCALE+" , "+*VSCALE
            ;Debug "offsetUV="+*UOFFSET+" , "+*VOFFSET
            ;Debug "Rotate="+*ANG
            ;FileSeek(0,Loc(0)+7)
           
          Case $4000 ; Object block (with name of your object)
            ModelName_.s = ReadString(0)
           
            AddElement(ModelName()) : ModelName() = ModelName_
           
          Case $4100 ;  Triangular mesh
          Case $4110 ; Your vertices
            qty_Vertex.w = ReadWord(0)
            count_Vertex=qty_Vertex
            *VBuffer = AllocateMemory(SizeOf(MyVertex)*qty_Vertex)
            *PtrV.MyVertex = *VBuffer
            For i=0 To qty_Vertex-1
              *PtrV\x = ReadFloat(0)
              *PtrV\y = ReadFloat(0)
              *PtrV\z = ReadFloat(0)
             
              CreateNode(0, 0,0,0):CreateNode(1, *PtrV\x,*PtrV\y,*PtrV\z)
              AttachNodeObject(0, NodeID(1))
              RotateNode(0,-90,0,0)
              *PtrV\x=NodeX(1):*PtrV\y=NodeY(1):*PtrV\z=NodeZ(1)
              FreeNode(0):FreeNode(1)
             
              AddElement(vertX()) : vertX() = *PtrV\x
              AddElement(vertY()) : vertY() = *PtrV\y
              AddElement(vertZ()) : vertZ() = *PtrV\z
             
             
              ;Vector Normalize
              length.f = Sqr(*PtrV\x * *PtrV\x + *PtrV\y * *PtrV\y + *PtrV\z * *PtrV\z)
              *PtrV\nx = *PtrV\x / length
              *PtrV\ny = *PtrV\y / length
              *PtrV\nz = *PtrV\z / length
             
              AddElement(vertNX()) : vertNX() = *PtrV\nx
              AddElement(vertNY()) : vertNY() = *PtrV\ny
              AddElement(vertNZ()) : vertNZ() = *PtrV\nz
              *PtrV + SizeOf(MyVertex)
            Next  
          Case $4120 ; Your faces
            qty_Triangle.w = ReadWord(0)
            count_Triangle=qty_Triangle
            *IBuffer=AllocateMemory(SizeOf(FTriangle)*qty_Triangle)
            *PtrF.FTriangle=*IBuffer
            For i=0 To qty_Triangle-1
              *PtrF\f1 = ReadWord(0)
              *PtrF\f2 = ReadWord(0)
              *PtrF\f3 = ReadWord(0)
              AddElement(faceV1()):faceV1()=*PtrF\f1
              AddElement(faceV2()):faceV2()=*PtrF\f2
              AddElement(faceV3()):faceV3()=*PtrF\f3
             
              face_flags.w = ReadWord(0)
              *PtrF + SizeOf(FTriangle)
            Next
           
           
          Case $4140 ; : Mapping coordinates list
            qty_Vertex.w = ReadWord(0)
            *PtrV.MyVertex = *VBuffer
            For i=0 To qty_Vertex-1
              *PtrV\u = ReadFloat(0)
              *PtrV\v = ReadFloat(0)
              AddElement(u()) : u() = *PtrV\u
              AddElement(v()) : v() = *PtrV\v
             
              *PtrV + SizeOf(MyVertex)
            Next
 
           
          Default
            For x = 1 To chunk_len - 6
              ReadByte(0)
            Next
        EndSelect
      Wend
     
      CloseFile(0)
     
      FreeMemory(*VBuffer)
      FreeMemory(*IBuffer)
      FirstElement(u()):FirstElement(v())
      FirstElement(vertX()):FirstElement(vertY()):FirstElement(vertZ())
      FirstElement(vertNX()):FirstElement(vertNY()):FirstElement(vertNZ())
      FirstElement(faceV1()):FirstElement(faceV2()):FirstElement(faceV3())
      FirstElement(TexturName()):FirstElement(ModelName())
      ProcedureReturn #True
    EndIf
   
  EndIf
  ProcedureReturn #False
 
EndProcedure
 
Procedure.l Load3ds( Mesh.l , FileName.s )
  If DataMesh( Mesh , FileName )=#True
   
    CreateMesh(Mesh)
   
    For q=0 To count_Vertex
      MeshVertexPosition(vertX(), vertY(), vertZ())
      NextElement(vertX()):NextElement(vertY()):NextElement(vertZ())
     
      MeshVertexNormal(vertNX(), vertNY(), vertNZ())
      NextElement(vertNX()):NextElement(vertNY()):NextElement(vertNZ())
     
      MeshVertexColor($FFFFFF)
      MeshVertexTextureCoordinate(u(), v())
      NextElement(u()):NextElement(v())
    Next
   
    For q=0 To count_Triangle
      MeshFace(faceV1(), faceV2(), faceV3())
      NextElement(faceV1()):NextElement(faceV2()):NextElement(faceV3())
    Next
   
    FinishMesh(1)
   
    Add3DArchive(GetPathPart(FileName.s), #PB_3DArchive_FileSystem)
    If FileSize(GetPathPart(FileName.s)+TexturName()) > 0
      CreateMaterial(0,LoadTexture(0,TexturName()))
      CreateEntity(Mesh, MeshID(Mesh), MaterialID(0))
    Else
      CreateEntity(Mesh, MeshID(Mesh),MaterialID(0))
    EndIf
   
    ClearList(u()):ClearList(v())
    ClearList(vertX()):ClearList(vertY()):ClearList(vertZ())
    ClearList(vertNX()):ClearList(vertNY()):ClearList(vertNZ())
    ClearList(faceV1()):ClearList(faceV2()):ClearList(faceV3())
    ClearList(TexturName()):ClearList(ModelName())
    ProcedureReturn #True
  EndIf
 
  ProcedureReturn #False
EndProcedure
 
Define.f KeyX, KeyY, MouseX, MouseY, RollZ
 
LoadFont(0, "Arial", 12, #PB_Font_Bold)
 
If InitEngine3D()
 
  InitSprite()
  InitKeyboard()
  InitMouse()
 
  If Screen3DRequester()
   
    Pattern$ = "3DS Files(*.3ds)|*.3ds"
    directory$ = ""
    FileName.s = OpenFileRequester("Пожалуйста, выберите файл для загрузки", directory$, Pattern$, 0)
   
    If Load3ds( 0 , FileName )=#True
    Else
      MessageRequester("Information", "Файл не выбран.", 0)
      End
    EndIf
   
    ;- Camera
    CreateCamera(0, 0, 0, 100, 100)
    CameraBackColor(0, RGB(200,200,200))
    MoveCamera(0, 0, 70, 90, #PB_Absolute)
    CameraLookAt(0, EntityX(0), EntityY(0), EntityZ(0))
   
    CreateLight(0, RGB(128, 128, 128),  0, 150, 0,#PB_Light_Directional)
    LightLookAt(0, EntityX(0), EntityY(0), EntityZ(0))
    AmbientColor(RGB(128, 128, 128))
   
    Repeat
      Screen3DEvents()
     
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
     
      If ExamineKeyboard()
       
        If KeyboardPushed(#PB_Key_A)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf
       
        If KeyboardPushed(#PB_Key_W)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf    
       
      EndIf
     
      RotateEntity(0, 0, 1, 0, #PB_Relative)
     
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
     
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
 
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
 
End


для версии PureBasic 5.11

load3ds.rar 3,33МБ

_________________
PureBasic 5.30(x86) | Windows 7 x64 Ultimate | 6г озу | NVIDIA GeForce GTX 650 1024 Мб


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: импорт 3ds формата
СообщениеДобавлено: Ср июл 23, 2014 9:43 am 
Не в сети
доцент

Зарегистрирован: Сб июл 13, 2013 3:39 pm
Сообщений: 46
Благодарил (а): 10 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Изображение
оригинал, скрин из макса
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: импорт 3ds формата
СообщениеДобавлено: Ср июл 23, 2014 11:31 am 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Да знаю :oops: . Загрузчик нормально отображает только один меш и одну текстуру и то если текстура не наложена как UnwrapUVW(Где надо наложить на модель не всю картинку, а лишь указанные части)

Изображение

Код слепип по аналогии других кодов на разных ЯП.
За основу взял вот этот http://www.purebasic.fr/english/viewtopic.php?f=12&t=36767&hilit=3ds.
В сети куча недоделанного примера, как будто косяка никто не видит, а где и как искать эти остальные чанки и считывать всю инфу из бинарника хз?

Я как то поднимал эту тему на этом форуме, но меня никто не поддержал http://pbasic.spb.ru/phpBB3ex/viewtopic.php?f=12&t=2362. :(
Вот и выложил код на всеобщее обозрение, что бы порешать проблему коллективно, может кто-то уже занимался этой темой. :)
Вообще есть одна легко выполнимая идея. Использовать любой игровой двиг, типа N3xtD или Blitz3D, RiBox3D грузить туда модель, там его разложить по всем составляющим и скинуть всё это к примеру в .txt формат, далее пишем загрузчик на Purebasic, который всё это принимает и отобразит. Так что можно будет грузить не только формат 3ds, а все принимающие форматы движка, но как я уже писал, хотелось бы без сторонних программ.

_________________
PureBasic 5.30(x86) | Windows 7 x64 Ultimate | 6г озу | NVIDIA GeForce GTX 650 1024 Мб


Последний раз редактировалось MishanayCool Пн авг 11, 2014 1:09 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: импорт 3ds формата
СообщениеДобавлено: Ср июл 23, 2014 1:19 pm 
Не в сети
доцент

Зарегистрирован: Сб июл 13, 2013 3:39 pm
Сообщений: 46
Благодарил (а): 10 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
MishanayCool писал(а):
Вообще есть одна легко выполнимая идея. Использовать любой игровой двиг, типа N3xtD или Blitz3D, RiBox3D грузить туда модель, там его разложить по всем составляющим и скинуть всё это к примеру в .txt формат, далее пишем загрузчик на Purebasic, который всё это принимает и отобразит. Так что можно будет грузить не только формат 3ds, а все принимающие форматы движка, но как я уже писал в этом теме http://pbasic.spb.ru/phpBB3ex/viewtopic.php?f=12&t=2362, хотелось бы без сторонних программ.

Вы и так с собой таскаете игровой движок, который кстати весит не так уж мало, я вот думаю будет проще сменить движок на более доработанный, если нужен формат 3ds попробуйте использовать Irrlicht на сколько я помню он по дефолту заточен под 3ds но плюс к этому поддерживает несколько форматов, и весит что то около 2-3 метров возможно даже к нему найдётся и оболочка для Purebasic


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: импорт 3ds формата
СообщениеДобавлено: Пн авг 11, 2014 1:03 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Ну вот, готовый импортёр с помощью стороннего движка. Принимает форматы 3Ds, B3d, X. :D
Все модели включая подмешы и текстурные карты отображаются правильно.

В архиве приложил модели для теста.
Скачать ImportMesh.rar 4,36МБ под версию Purebasic 5.11

По идее можно легко написать конвертер в Mesh формат с помощью команды SaveMesh(#Mesh, Filename$), которые легко будут импортироваться в Purebasic.

_________________
PureBasic 5.30(x86) | Windows 7 x64 Ultimate | 6г озу | NVIDIA GeForce GTX 650 1024 Мб


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB