3D Modelling II - Minimal Code + Read From File

Category: 3D

Date: 02-16-2022

Return to Index


 
'Compilable Example:  (Jose Includes)
#Compiler PBWin 9, PBWin 10
#Compile EXE
#Dim All
%Unicode=1
#Include "Win32API.inc"
#Resource "gbsnippets.pbr"     'misc icons
 
Type PointX : X As Single : Y As Single : Z As Single : End Type
Type TriangleX : p1 As Long  : p2 As Long  : p3 As Long : End Type
Type Polypoints
   Count As Long : x1 As Single : y1 As Single : x2 As Single : y2 As Single : x3 As Single : y3 As Single
End Type
 
   %IDC_Graphic = 500 : %IDC_Timer = 501
 
   Global hDlg As DWord, P() As PointX, T() As TriangleX
 
Function PBMain()
   Dialog New Pixels, 0, "3D Objects",,,200,200, %WS_SysMenu Or %WS_ClipChildren, To hDlg
   Control Add Graphic, hDlg, %IDC_Graphic, "", 10,10,180,180
   Graphic Attach hDlg, %IDC_Graphic, Redraw
   Graphic Color %Black, %rgb_Wheat
   Dialog Show Modal hDlg Call DlgProc
End Function
 
CallBack Function DlgProc() As Long
   Select Case CB.Msg
      Case %WM_InitDialog
         LoadObjectFromFile "model_cube.txt"
         SetTimer(hDlg, %IDC_Timer, 40, %NULL)    'sends %WM_Timer to dialog callback
      Case %WM_Timer
         Graphic Clear : RotateXYZ : DrawObject : Graphic Redraw
   End Select
End Function
 
Sub RotateXYZ
   Local i As Long, NewX As Single, NewY As Single, NewZ As Single, Angle As Single
   Angle = 0.05
   For i = 1 To UBound(P)
      NewY = P(i).Y * Cos(Angle) - P(i).Z * Sin(Angle)    'X rotation
      NewZ = P(i).Y * Sin(Angle) + P(i).Z * Cos(Angle)    'X rotation
      P(i).Y = NewY : P(i).Z = NewZ
      NewX = P(i).Z * Sin(Angle) + P(i).X * Cos(Angle)    'Y rotation
      NewZ = P(i).Z * Cos(Angle) - P(i).X * Sin(Angle)    'Y rotation
      P(i).X = NewX : P(i).Z = NewZ
      NewX = P(i).X * Cos(Angle) - P(i).Y * Sin(Angle)    'Z rotation
      NewY = P(i).X * Sin(Angle) + P(i).Y * Cos(Angle)    'Z rotation
      P(i).X = NewX : P(i).Y = NewY
   Next i
End Sub
 
Sub DrawObject()
   Local i As Long, PTS As PolyPoints, OffsetY As Long, OffsetX As Long
   OffsetX = 90 : OffsetY = 90 : PTS.Count = 3
   For i = 1 To UBound(T)
      PTS.x1 = P(T(i).p1).x + OffsetX : PTS.y1 = P(T(i).p1).y + OffsetY
      PTS.x2 = P(T(i).p2).x + OffsetX : PTS.y2 = P(T(i).p2).y + OffsetY
      PTS.x3 = P(T(i).p3).x + OffsetX : PTS.y3 = P(T(i).p3).y + OffsetY
      Graphic Polygon PTS, %Blue  ', %Red, 0, 0    'can shade also
   Next i
End Sub
 
Sub LoadObjectFromFile (fName As String)
   Local temp As String, i As Long
   Open fName For Input As #1
   Line Input #1, temp
   If Left$(temp,9) <> "gb3DModelThen Exit Sub
   Line Input #1, temp
   While Instr(temp, "  ") : Replace "  With " In temp : Wend   'remove extra spaces
   ReDim P(Val(Parse$(temp, " ", 1)))
   ReDim T(Val(Parse$(temp, " ", 2)))
   For i = 1 To UBound(P)
      Line Input #1, temp
      While Instr(temp, "  ") : Replace "  With " In temp : Wend   'remove extra spaces
      P(i).x = Val(Parse$(temp, " ", 2))
      P(i).y = Val(Parse$(temp, " ", 3))
      P(i).z = Val(Parse$(temp, " ", 4))
   Next i
   For i = 1 To UBound(T)
      Line Input #1, temp
      While Instr(temp, "  ") : Replace "  With " In temp : Wend   'remove extra spaces
      T(i).p1 = Val(Parse$(temp, " ", 2))
      T(i).p2 = Val(Parse$(temp, " ", 3))
      T(i).p3 = Val(Parse$(temp, " ", 4))
   Next i
   Close #1
End Sub
 
'gbs_00561
'Date: 03-10-2012


created by gbSnippets
http://www.garybeene.com/sw/gbsnippets.htm