PureBasic

Forums PureBasic
Nous sommes le Mar 18/Juin/2019 11:56

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 4 messages ] 
Auteur Message
 Sujet du message: CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)
MessagePosté: Dim 02/Avr/2017 23:10 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6853
Localisation: IDF (Yvelines)
Avec la dernière version de PureBasic il est possible de créer non seulement des planes, cubes, spheres, cylindres mais aussi des torus, des cones , des capsules et des .... IcoSphere (J'avoue que je ne vois pas la différence avec les spheres)

Je vous propose d'ajouter les pyramides avec cette procédure

:arrow: CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)

Code:
Declare CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)

InitEngine3D() : InitKeyboard() : InitSprite()

OpenWindow(0,0,0,1024,768,"test")
OpenWindowedScreen(WindowID(0),0,0,1024,768)

Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/waterworld.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()

SkyBox("desert07.jpg")

;Caméra, Lumiere & Ombre
CreateCamera(0, 0, 0, 100, 100)
CameraBackColor(0, RGB(0, 0, 0))
MoveCamera(0, 0, 1.5, 4)
CameraLookAt(0, 0, 0, 0)

; Light
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any, RGB(151, 251, 151), -200, 100, -500)
WorldShadows(#PB_Shadow_Additive)

CreateMaterial(0, TextureID(LoadTexture(-1, "Dirt.jpg")))
CreateMaterial(1, TextureID(LoadTexture(-1, "Floor02.jpg")))

CreatePlane(0, 5, 5, 1, 1, 5, 5)
CreateEntity(0, MeshID(0), MaterialID(0), 0, 0, 0)

CreatePyramid(0, 1, 1, 0.5)
CreateEntity(1, MeshID(0), MaterialID(1), 1, 0.5, 1)

CreatePyramid(0, 1, 1, 0)
CreateEntity(2, MeshID(0), MaterialID(1), -1, 0.5, 1)


While #True 
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until Event = 0   
 
  If ExamineKeyboard() 
    If KeyboardReleased(#PB_Key_Escape)
      Break
    EndIf   
  EndIf
 
  RenderWorld()
  FlipBuffers()
Wend

Procedure CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)
  Protected Dim MeshData.PB_MeshVertex(0)
  Protected Result = CreateCube(Mesh, Width)
 
  If Mesh = #PB_Any
    Mesh = Result
  EndIf
 
  GetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate, 0, MeshVertexCount(Mesh)-1)
 
  ;(3, 10, 16)
  MeshData(3)\x   = -SizeTop/2
  MeshData(10)\x  = -SizeTop/2
  MeshData(16)\x  = -SizeTop/2
  MeshData(3)\z   = SizeTop/2
  MeshData(10)\z  = SizeTop/2
  MeshData(16)\z  = SizeTop/2
  MeshData(3)\y   = Height/2
  MeshData(10)\y  = Height/2
  MeshData(16)\y  = Height/2
 
  ;(6, 11, 19)
  MeshData(6)\x   = -SizeTop/2
  MeshData(11)\x  = -SizeTop/2
  MeshData(19)\x  = -SizeTop/2
  MeshData(6)\z   = -SizeTop/2
  MeshData(11)\z  = -SizeTop/2
  MeshData(19)\z  = -SizeTop/2
  MeshData(6)\y   = Height/2
  MeshData(11)\y  = Height/2
  MeshData(19)\y  = Height/2
 
  ;(7, 14, 18)
  MeshData(7)\x   = SizeTop/2
  MeshData(14)\x  = SizeTop/2
  MeshData(18)\x  = SizeTop/2
  MeshData(7)\z   = -SizeTop/2
  MeshData(14)\z  = -SizeTop/2
  MeshData(18)\z  = -SizeTop/2
  MeshData(7)\y   = Height/2
  MeshData(14)\y  = Height/2
  MeshData(18)\y  = Height/2
 
  ;(2, 15, 17)
  MeshData(2)\x   = SizeTop/2
  MeshData(15)\x  = SizeTop/2
  MeshData(17)\x  = SizeTop/2 
  MeshData(2)\z   = SizeTop/2
  MeshData(15)\z  = SizeTop/2
  MeshData(17)\z  = SizeTop/2
  MeshData(2)\y   = Height/2
  MeshData(15)\y  = Height/2
  MeshData(17)\y  = Height/2
 
  ;(0, 9, 23)
  MeshData(0)\y   = -Height/2
  MeshData(9)\y   = -Height/2
  MeshData(23)\y  = -Height/2
 
  ;(5, 8, 20)
  MeshData(5)\y   = -Height/2
  MeshData(8)\y   = -Height/2
  MeshData(20)\y  = -Height/2
 
  ;(4, 13, 21)
  MeshData(4)\y   = -Height/2
  MeshData(13)\y  = -Height/2
  MeshData(21)\y  = -Height/2
 
  ;(1, 12, 22)
  MeshData(1)\y   = -Height/2
  MeshData(12)\y  = -Height/2
  MeshData(22)\y  = -Height/2
 
  SetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate, 0, MeshVertexCount(Mesh)-1)
 
  ProcedureReturn Result
EndProcedure

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat & http://purebasic.chat/forum

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)
MessagePosté: Lun 03/Avr/2017 0:34 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3414
Quiz : Icosphère.

La sphère classique est calculée en convenant de deux pôles opposés à l'instar des fuseaux horaires.

Problème : on obtient des faces à angles aigus autour des pôles, ce qui peut compliquer la tâche des rendus de textures.

L'icosphère, après vérif sur wiki + code c++ + souvenir d'un excellent code de Kelebrindae (06/2008) (voir "icosaèdre" pour le lien lexical "ico"), c'est un tout petit peu comme un ballon de foot : quelque soit le point de vue, on voit toujours la même forme de face.

Dans ce cas, on va programmer tout le jeu/application pour une seule face, apprécier l'angle entre 2 faces et répéter le principe sur toute la sphère sans se soucier si on est près de l'équateur (1), au sein des hémisphères (2), ou autour des pôles (3).

On simplifie par 3 fois les calculs de rendu. Et les calculs de densité sont absolument les mêmes partout et constant, alors que les calculs de densité sont variables sur une sphère classique, et dépendent de la distance par rapport à l'équateur. (ainsi au strict pôle Nord on fait trois pas pour gravir tous les fuseaux horaire alors qu'à l'équateur, il faut un bon trot d'un mois pour ne changer que d'un seul fuseau horaire : les densités sont bel et bien variables)

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)
MessagePosté: Lun 03/Avr/2017 8:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Juin/2015 16:18
Messages: 255
pour voir a quoi ressemble l'icosphere tu peux utiliser le rendu en fil de fer
MaterialShadingMode(1,#PB_Material_Wireframe)

pour une pyramide simple tu peux utiliser :
CreateCone avec 4 pour NbSegmentsBase


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: CreatePyramid(Mesh, Width.f, Height.f, SizeTop.f=0)
MessagePosté: Lun 03/Avr/2017 11:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6853
Localisation: IDF (Yvelines)
Guillot a écrit:
pour une pyramide simple tu peux utiliser :
CreateCone avec 4 pour NbSegmentsBase
C'est ce que j'avais fait au début mais ensuite il faut la scaler et modifier le plan d'alignement.

Avec ma procédure je peux aussi modifier la taille du sommet.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat & http://purebasic.chat/forum

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 4 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye