Page 1 sur 1

Cone, Torus & Pyramid

Publié : mer. 07/janv./2015 12:03
par falsam
La plupart des moteur ou logiciel de modélisation 3D propose la création d'un torus, un cone et d'une pyramide sauf Ogre3D.

Depuis ce matin, StarBootics sur le forum anglais propose la création d'un torus.

C'est un sujet que vous pouvez suivre sur ce lien.

:arrow: http://www.purebasic.fr/english/viewtop ... 36&t=61370

Cone, Torus & Pyramid

Publié : mer. 07/janv./2015 12:05
par falsam
J'ai testé le rendu de la création d'un torus. C'est pas mal du tout mais il y a un souci de réception de la lumière sur le torus comme vous pouvez le voir avec ce code ou j'ai placé un cube, une sphére et un torus.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration

Global Event

Macro LinearlySpacedValue(IncrementID, IncrementMax, MinValue, MaxValue)
   ((MinValue) + ((MaxValue) - (MinValue)) * ((IncrementID) / (IncrementMax)))
EndMacro

;CreateTorus() - By StarBootics
Macro CalculateTorusVertex(MinorRadius, MajorRadius, Uxx, Vxx)
  MeshVertexPosition((MajorRadius + MinorRadius * Cos(Vxx)) * Cos(Uxx), (MajorRadius + MinorRadius * Cos(Vxx)) * Sin(Uxx), MinorRadius * Sin(Vxx))
  MeshVertexTextureCoordinate(Uxx / (2*#PI), Vxx / (2*#PI))
  MeshVertexNormal(0,1, 0)
EndMacro

Procedure CreateTorus(MeshID, MinorRadius.f, MajorRadius.f, Meridian = 32, Parallel = 32)
  Protected MeshHandle, P00, P01, P02, P03, MeridianID, U00.d, U01.d, ParallelID, V00.d, V01.d
  
  MeshHandle = CreateMesh(MeshID, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  
  If MeshID = #PB_Any
    MeshID = MeshHandle
  EndIf
  
  If IsMesh(MeshID)
    
    AddSubMesh()
    
    If Meridian < 3
      Meridian = 3
    EndIf
    
    If Parallel < 3
      Parallel = 3
    EndIf
    
    P00 = 0
    P01 = P00 + 1
    P02 = P01 + 1
    P03 = P02 + 1

    For MeridianID = 0 To Meridian - 1
      
      U00 = LinearlySpacedValue(MeridianID, Meridian, 0.0, 2.0 * #PI)
      U01 = LinearlySpacedValue(MeridianID + 1, Meridian, 0.0, 2.0 * #PI)
      
      For ParallelID = 0 To Parallel - 1
        
        V00 = LinearlySpacedValue(ParallelID, Parallel, 0.0, 2.0 * #PI)
        V01 = LinearlySpacedValue(ParallelID + 1, Parallel, 0.0, 2.0 * #PI)

        CalculateTorusVertex(MinorRadius, MajorRadius, U00, V00) ; P00
        CalculateTorusVertex(MinorRadius, MajorRadius, U01, V00) ; P01
        CalculateTorusVertex(MinorRadius, MajorRadius, U01, V01) ; P02
        CalculateTorusVertex(MinorRadius, MajorRadius, U00, V01) ; P03
        
        MeshFace(P00, P01, P02)
        MeshFace(P02, P03, P00)
        
        P00 = P03 + 1
        P01 = P00 + 1
        P02 = P01 + 1
        P03 = P02 + 1

      Next
      
    Next
    
    NormalizeMesh(MeshID, 0)
    BuildMeshTangents(MeshID)
    
    FinishMesh(#True)
    
  EndIf
  
  ProcedureReturn MeshID
EndProcedure

InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()

OpenWindow(#Mainform, 0, 0, 1024, 768, "Create Torus", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0, 0, 1024, 768)

KeyboardMode(#PB_Keyboard_International)
 
;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -4, 50, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

MoveCamera(Camera, 10, 10, 15, #PB_Absolute)  
CameraLookAt(Camera, 0,0,0)   

;Material
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Textures", #PB_3DArchive_FileSystem)
CreateMaterial(0, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
CreateMaterial(1, TextureID(LoadTexture(#PB_Any, "MRAMOR6X6.jpg")))

;Entities
CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 30, 30, 10, 10, 5, 5)), MaterialID(0))
CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 4)), MaterialID(1), -6, 3, 0)
CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any, 2)), MaterialID(1), 0, 3, 0)
CreateEntity(#PB_Any, MeshID(CreateTorus(#PB_Any, 1, 2)), MaterialID(1), 6, 3, 0)

Repeat
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
  
  If ExamineKeyboard()
    
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
  EndIf
  
  RenderWorld(80)
  FlipBuffers()  
  
ForEver

Re: Cone, Torus & Pyramid

Publié : mer. 07/janv./2015 21:22
par falsam
Correction du code pour un meilleur rendu lumineux. Cette solution est fourni par Samuel sur le forum anglais