[BB] 3D Plots And 3D Lines Functions

Started by Filax, March 06, 2025, 15:11:42

Previous topic - Next topic

Filax

Code: BASIC
; ----------------------------------------
; Name : Draw 3D Plot and 3D Lines by Filax
; Date : (C)2025 
; Site : https://github.com/BlackCreepyCat
; ----------------------------------------

Graphics3D 1920,1080,32,2
SetBuffer BackBuffer()

Global camera = CreateCamera()
PositionEntity camera, 0, 0, -8


amp=CreatePivot() 

; Coordonnées des 8 sommets du cube (taille 5)
Local x1 = -2.5, y1 = -2.5, z1 = -2.5
Local x2 =  2.5, y2 = -2.5, z2 = -2.5
Local x3 =  2.5, y3 = -2.5, z3 =  2.5
Local x4 = -2.5, y4 = -2.5, z4 =  2.5
Local x5 = -2.5, y5 =  2.5, z5 = -2.5

MPointA = CreatePoint3D%(x1, y1, z1, 0.2, 255,0,0,1.0)  : EntityParent  MPointA, amp
MPointB = CreatePoint3D%(x1, y5, z1, 0.2, 255,0,0,1.0)  : EntityParent  MPointB, amp

MPointA = CreatePoint3D%(x1, y1, z3, 0.2, 0,255,0,1.0)  : EntityParent  MPointA, amp
MPointB = CreatePoint3D%(x1, y5, z3, 0.2, 0,255,0,1.0)  : EntityParent  MPointB, amp


MPointA = CreatePoint3D%(x2, y5, z3, 0.2, 255,0,255,1.0)  : EntityParent  MPointA, amp
MPointA = CreatePoint3D%(x2, y1, z3, 0.2, 255,0,255,1.0)  : EntityParent  MPointA, amp


MPointA = CreatePoint3D%(x2, y5, z1, 0.2, 0,255,255,1.0)  : EntityParent  MPointA, amp
MPointA = CreatePoint3D%(x2, y1, z1, 0.2, 0,255,255,1.0)  : EntityParent  MPointA, amp




; Correction de la ligne jaune, testez sans ajouter de décalage sur y
MeshA = CreateLine3D(x1, y2, z2, x4, y4, z4, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp
MeshA = CreateLine3D(x2, y2, z2, x3, y4, z4, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp 

MeshA = CreateLine3D(x1, y5, z2, x4, y5, z4, 0.01,  100, 100, 100, 1.0)    : EntityParent  MeshA, amp
MeshA = CreateLine3D(x2, y5, z2, x3, y5, z4, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp


MeshA = CreateLine3D(x2, y5, z2, x2, y4, z2, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp 
MeshA = CreateLine3D(x1, y5, z2, x1, y4, z2, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp


MeshA = CreateLine3D(x2, y5, z3, x2, y4, z3, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp
MeshA = CreateLine3D(x1, y5, z3, x1, y4, z3, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp



MeshA = CreateLine3D(x1, y5, z3, x2, y5, z3, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp 
MeshA = CreateLine3D(x1, y5, z2, x2, y5, z2, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp

MeshA = CreateLine3D(x1, y2, z3, x2, y2, z3, 0.01,  100, 100, 100, 1.0)   : EntityParent  MeshA, amp
MeshA = CreateLine3D(x1, y2, z2, x2, y2, z2, 0.01,  100, 100, 100, 1.0)   :EntityParent  MeshA, amp



While Not KeyHit(1)
    TurnEntity amp, 0.3, 0.1, 00.2
	
	
	
    RenderWorld
    Text 10,10,"ESC - Quitter"
    Flip True
Wend
End

Function CreatePoint3D%(x#, y#, z#, size# = 0.1, r%=255, g%=255, b%=255, alpha#=1.0)
    Local mesh = CreateMesh()
    Local surf = CreateSurface(mesh)
    
    ; Taille divisée par 2 pour centrer les quads autour du point
    Local halfSize# = size / 2.0
    
    ; Création de la texture avec canal alpha
    Local tex = CreateTexture(32, 32, 1 + 2) ; 1 = couleur, 2 = alpha
    SetBuffer TextureBuffer(tex)
    ; Fond transparent (alpha = 0)
    Color 0, 0, 0
	
    Rect 0, 0, 32, 32, 1
    ; Ovale opaque (alpha = 255)
    Color r, g, b ; Utilise la couleur demandée pour l'ovale
    Oval 8, 8, 16, 16, 1
    SetBuffer BackBuffer()
	
	
	
    
    ; Application de la texture au mesh
    EntityTexture mesh, tex
    
    ; --- Quad 1 : Plan XY (face vers Z) ---
    Local v0 = AddVertex(surf, x - halfSize, y - halfSize, z, 0, 1)
    Local v1 = AddVertex(surf, x + halfSize, y - halfSize, z, 1, 1)
    Local v2 = AddVertex(surf, x + halfSize, y + halfSize, z, 1, 0)
    Local v3 = AddVertex(surf, x - halfSize, y + halfSize, z, 0, 0)
    
    AddTriangle(surf, v0, v1, v2)
    AddTriangle(surf, v0, v2, v3)
    AddTriangle(surf, v2, v1, v0) ; Face arrière
    AddTriangle(surf, v3, v2, v0) ; Face arrière
    
    ; --- Quad 2 : Plan XZ (face vers Y) ---
    Local v4 = AddVertex(surf, x - halfSize, y, z - halfSize, 0, 1)
    Local v5 = AddVertex(surf, x + halfSize, y, z - halfSize, 1, 1)
    Local v6 = AddVertex(surf, x + halfSize, y, z + halfSize, 1, 0)
    Local v7 = AddVertex(surf, x - halfSize, y, z + halfSize, 0, 0)
    
    AddTriangle(surf, v4, v5, v6)
    AddTriangle(surf, v4, v6, v7)
    AddTriangle(surf, v6, v5, v4) ; Face arrière
    AddTriangle(surf, v7, v6, v4) ; Face arrière
    
    ; --- Quad 3 : Plan YZ (face vers X) ---
    Local v8 = AddVertex(surf, x, y - halfSize, z - halfSize, 0, 1)
    Local v9 = AddVertex(surf, x, y + halfSize, z - halfSize, 1, 1)
    Local v10 = AddVertex(surf, x, y + halfSize, z + halfSize, 1, 0)
    Local v11 = AddVertex(surf, x, y - halfSize, z + halfSize, 0, 0)
    
    AddTriangle(surf, v8, v9, v10)
    AddTriangle(surf, v8, v10, v11)
    AddTriangle(surf, v10, v9, v8) ; Face arrière
    AddTriangle(surf, v11, v10, v8) ; Face arrière
    
    ; Mode de fusion additif
    EntityBlend mesh, 3 ; 3 = additive blending
    EntityAlpha mesh, alpha ; Applique la transparence globale si nécessaire
    
    ; Libérer la texture (chaque point a sa propre texture ici)
    FreeTexture tex
    
    Return mesh
End Function

Function CreateLine3D%(x1#, y1#, z1#, x2#, y2#, z2#, width# = 0.05, r%=255, g%=255, b%=255, alpha#=1.0)
    Local mesh = CreateMesh()
    Local surf = CreateSurface(mesh)
    
    ; Calcul de la direction et de la longueur
    Local dx# = x2 - x1
    Local dy# = y2 - y1
    Local dz# = z2 - z1
    Local length# = Sqr(dx * dx + dy * dy + dz * dz)
    If length = 0 Then Return mesh
    
    ; Normalisation du vecteur de direction
    dx = dx / length
    dy = dy / length
    dz = dz / length
    
    ; Choix d'un vecteur "up" en fonction de la direction
    Local upX#, upY#, upZ#
    If Abs(dy) > 0.999 ; Ligne presque parfaitement verticale
        upX = 1 ; Utiliser l'axe X comme "up" pour les lignes verticales
        upY = 0
        upZ = 0
    Else
        upX = 0 ; Axe Y par défaut pour les autres cas
        upY = 1
        upZ = 0
    EndIf
    
    ; Premier vecteur perpendiculaire (side1)
    Local side1X# = dy * upZ - dz * upY
    Local side1Y# = dz * upX - dx * upZ
    Local side1Z# = dx * upY - dy * upX
    
    ; Normalisation et mise à l'échelle pour la largeur
    Local side1Length# = Sqr(side1X * side1X + side1Y * side1Y + side1Z * side1Z)
    If side1Length > 0
        side1X = side1X * width / side1Length
        side1Y = side1Y * width / side1Length
        side1Z = side1Z * width / side1Length
    EndIf
    
    ; Deuxième vecteur perpendiculaire (produit vectoriel entre direction et side1)
    Local side2X# = dy * side1Z - dz * side1Y
    Local side2Y# = dz * side1X - dx * side1Z
    Local side2Z# = dx * side1Y - dy * side1X
    
    ; Normalisation et mise à l'échelle pour la largeur
    Local side2Length# = Sqr(side2X * side2X + side2Y * side2Y + side2Z * side2Z)
    If side2Length > 0
        side2X = side2X * width / side2Length
        side2Y = side2Y * width / side2Length
        side2Z = side2Z * width / side2Length
    EndIf
    
    ; --- Premier quad (orienté selon side1) ---
    Local v0 = AddVertex(surf, x1 - side1X, y1 - side1Y, z1 - side1Z, 0, 0)
    Local v1 = AddVertex(surf, x1 + side1X, y1 + side1Y, z1 + side1Z, 1, 0)
    Local v2 = AddVertex(surf, x2 + side1X, y2 + side1Y, z2 + side1Z, 1, 1)
    Local v3 = AddVertex(surf, x2 - side1X, y2 - side1Y, z2 - side1Z, 0, 1)
    
    ; Triangles pour le premier quad (double face)
    AddTriangle(surf, v0, v1, v2)
    AddTriangle(surf, v0, v2, v3)
    AddTriangle(surf, v2, v1, v0) ; Face arrière
    AddTriangle(surf, v3, v2, v0) ; Face arrière
    
    ; --- Deuxième quad (orienté selon side2) ---
    Local v4 = AddVertex(surf, x1 - side2X, y1 - side2Y, z1 - side2Z, 0, 0)
    Local v5 = AddVertex(surf, x1 + side2X, y1 + side2Y, z1 + side2Z, 1, 0)
    Local v6 = AddVertex(surf, x2 + side2X, y2 + side2Y, z2 + side2Z, 1, 1)
    Local v7 = AddVertex(surf, x2 - side2X, y2 - side2Y, z2 - side2Z, 0, 1)
    
    ; Triangles pour le deuxième quad (double face)
    AddTriangle(surf, v4, v5, v6)
    AddTriangle(surf, v4, v6, v7)
    AddTriangle(surf, v6, v5, v4) ; Face arrière
    AddTriangle(surf, v7, v6, v4) ; Face arrière
    
    ; Application de la couleur et transparence
    EntityColor mesh, r, g, b
    EntityAlpha mesh, alpha
    
    Return mesh
End Function


Filax

Another example :

Code: BASIC
; ----------------------------------------
; Name : Draw 3D Plot and 3D Lines by Filax
; Date : (C)2025 
; Site : https://github.com/BlackCreepyCat
; ----------------------------------------

Graphics3D 1920,1080,32,0
SetBuffer BackBuffer()




Global camera = CreateCamera()
PositionEntity camera, 0, 0, -6  ; Position initiale de la caméra
CameraRange camera ,0.01,100
amp = CreatePivot() 

Local x1, y1, z1
Local zoomDistance# = -6  ; Distance initiale de la caméra
Local zoomSpeed = 0.7   ; Vitesse du zoom




For I = 0 To 400
    x1 = Rnd(-2.5, 2.5)
    y1 = Rnd(-2.5, 2.5)
    z1 = Rnd(-2.5, 2.5)
    
    MPointA = CreatePoint3D%(x1, y1, z1, 0.06, 255, 0, 0, 1.0)  
    EntityParent MPointA, amp
    
    x2 = Rnd(-2.5, 2.5)
    y2 = Rnd(-2.5, 2.5)
    z2 = Rnd(-2.5, 2.5)
    
    MPointA = CreatePoint3D%(x2, y2, z2, 0.06, 255, 0, 0, 1.0)
    EntityParent MPointA, amp
    
    MeshA = CreateLine3D(x1, y1, z1, x2, y2, z2, 0.002, 100, 100, 200, 0.6)
    EntityParent MeshA, amp
Next 

While Not KeyHit(1)
    ; Gestion du zoom avec la molette de la souris
	wheel = MouseZSpeed()
	
	
    ; On ajuste la distance de la caméra en fonction du mouvement de la molette
    If wheel <> 0
        zoomDistance = zoomDistance + (wheel * zoomSpeed ) 
    EndIf
    
    ; On limite le zoom pour éviter que la caméra ne soit trop proche ou trop loin
  ;  If zoomDistance < -15 Then zoomDistance = -15
    If zoomDistance > 0 Then zoomDistance = 0
    
    ; Applique la nouvelle distance de la caméra avec un vecteur
    PositionEntity camera, 0, 0, zoomDistance  ; On applique la nouvelle position de la caméra
    
    ; Rotation de l'amp
    TurnEntity amp, 0.3, 0.1, 0.2
    
    RenderWorld
    Text 10,10,"ESC - Quitter; " + zoomDistance
    Flip True
Wend



	

Function CreatePoint3D%(x#, y#, z#, size# = 0.1, r%=255, g%=255, b%=255, alpha#=1.0)
    Local mesh = CreateMesh()
    Local surf = CreateSurface(mesh)
    
    ; Taille divisée par 2 pour centrer les quads autour du point
    Local halfSize# = size / 2.0
    
    ; Création de la texture avec canal alpha
    Local tex = CreateTexture(32, 32, 1 + 2) ; 1 = couleur, 2 = alpha
    SetBuffer TextureBuffer(tex)
    ; Fond transparent (alpha = 0)
    Color 0, 0, 0
	
    Rect 0, 0, 32, 32, 1
    ; Ovale opaque (alpha = 255)
    Color r, g, b ; Utilise la couleur demandée pour l'ovale
    Oval 8, 8, 16, 16, 1
    SetBuffer BackBuffer()
	
	
    ; Application de la texture au mesh
    EntityTexture mesh, tex
    
    ; --- Quad 1 : Plan XY (face vers Z) ---
    Local v0 = AddVertex(surf, x - halfSize, y - halfSize, z, 0, 1)
    Local v1 = AddVertex(surf, x + halfSize, y - halfSize, z, 1, 1)
    Local v2 = AddVertex(surf, x + halfSize, y + halfSize, z, 1, 0)
    Local v3 = AddVertex(surf, x - halfSize, y + halfSize, z, 0, 0)
    
    AddTriangle(surf, v0, v1, v2)
    AddTriangle(surf, v0, v2, v3)
    AddTriangle(surf, v2, v1, v0) ; Face arrière
    AddTriangle(surf, v3, v2, v0) ; Face arrière
    
    ; --- Quad 2 : Plan XZ (face vers Y) ---
    Local v4 = AddVertex(surf, x - halfSize, y, z - halfSize, 0, 1)
    Local v5 = AddVertex(surf, x + halfSize, y, z - halfSize, 1, 1)
    Local v6 = AddVertex(surf, x + halfSize, y, z + halfSize, 1, 0)
    Local v7 = AddVertex(surf, x - halfSize, y, z + halfSize, 0, 0)
    
    AddTriangle(surf, v4, v5, v6)
    AddTriangle(surf, v4, v6, v7)
    AddTriangle(surf, v6, v5, v4) ; Face arrière
    AddTriangle(surf, v7, v6, v4) ; Face arrière
    
    ; --- Quad 3 : Plan YZ (face vers X) ---
    Local v8 = AddVertex(surf, x, y - halfSize, z - halfSize, 0, 1)
    Local v9 = AddVertex(surf, x, y + halfSize, z - halfSize, 1, 1)
    Local v10 = AddVertex(surf, x, y + halfSize, z + halfSize, 1, 0)
    Local v11 = AddVertex(surf, x, y - halfSize, z + halfSize, 0, 0)
    
    AddTriangle(surf, v8, v9, v10)
    AddTriangle(surf, v8, v10, v11)
    AddTriangle(surf, v10, v9, v8) ; Face arrière
    AddTriangle(surf, v11, v10, v8) ; Face arrière
    
    ; Mode de fusion additif
    EntityBlend mesh, 3 ; 3 = additive blending
    EntityAlpha mesh, alpha ; Applique la transparence globale si nécessaire
    
    ; Libérer la texture (chaque point a sa propre texture ici)
    FreeTexture tex
    
    Return mesh
End Function

Function CreateLine3D%(x1#, y1#, z1#, x2#, y2#, z2#, width# = 0.05, r%=255, g%=255, b%=255, alpha#=1.0)
    Local mesh = CreateMesh()
    Local surf = CreateSurface(mesh)
    
    ; Calcul de la direction et de la longueur
    Local dx# = x2 - x1
    Local dy# = y2 - y1
    Local dz# = z2 - z1
    Local length# = Sqr(dx * dx + dy * dy + dz * dz)
    If length = 0 Then Return mesh
    
    ; Normalisation du vecteur de direction
    dx = dx / length
    dy = dy / length
    dz = dz / length
    
    ; Choix d'un vecteur "up" en fonction de la direction
    Local upX#, upY#, upZ#
    If Abs(dy) > 0.999 ; Ligne presque parfaitement verticale
        upX = 1 ; Utiliser l'axe X comme "up" pour les lignes verticales
        upY = 0
        upZ = 0
    Else
        upX = 0 ; Axe Y par défaut pour les autres cas
        upY = 1
        upZ = 0
    EndIf
    
    ; Premier vecteur perpendiculaire (side1)
    Local side1X# = dy * upZ - dz * upY
    Local side1Y# = dz * upX - dx * upZ
    Local side1Z# = dx * upY - dy * upX
    
    ; Normalisation et mise à l'échelle pour la largeur
    Local side1Length# = Sqr(side1X * side1X + side1Y * side1Y + side1Z * side1Z)
    If side1Length > 0
        side1X = side1X * width / side1Length
        side1Y = side1Y * width / side1Length
        side1Z = side1Z * width / side1Length
    EndIf
    
    ; Deuxième vecteur perpendiculaire (produit vectoriel entre direction et side1)
    Local side2X# = dy * side1Z - dz * side1Y
    Local side2Y# = dz * side1X - dx * side1Z
    Local side2Z# = dx * side1Y - dy * side1X
    
    ; Normalisation et mise à l'échelle pour la largeur
    Local side2Length# = Sqr(side2X * side2X + side2Y * side2Y + side2Z * side2Z)
    If side2Length > 0
        side2X = side2X * width / side2Length
        side2Y = side2Y * width / side2Length
        side2Z = side2Z * width / side2Length
    EndIf
    
    ; --- Premier quad (orienté selon side1) ---
    Local v0 = AddVertex(surf, x1 - side1X, y1 - side1Y, z1 - side1Z, 0, 0)
    Local v1 = AddVertex(surf, x1 + side1X, y1 + side1Y, z1 + side1Z, 1, 0)
    Local v2 = AddVertex(surf, x2 + side1X, y2 + side1Y, z2 + side1Z, 1, 1)
    Local v3 = AddVertex(surf, x2 - side1X, y2 - side1Y, z2 - side1Z, 0, 1)
    
    ; Triangles pour le premier quad (double face)
    AddTriangle(surf, v0, v1, v2)
    AddTriangle(surf, v0, v2, v3)
    AddTriangle(surf, v2, v1, v0) ; Face arrière
    AddTriangle(surf, v3, v2, v0) ; Face arrière
    
    ; --- Deuxième quad (orienté selon side2) ---
    Local v4 = AddVertex(surf, x1 - side2X, y1 - side2Y, z1 - side2Z, 0, 0)
    Local v5 = AddVertex(surf, x1 + side2X, y1 + side2Y, z1 + side2Z, 1, 0)
    Local v6 = AddVertex(surf, x2 + side2X, y2 + side2Y, z2 + side2Z, 1, 1)
    Local v7 = AddVertex(surf, x2 - side2X, y2 - side2Y, z2 - side2Z, 0, 1)
    
    ; Triangles pour le deuxième quad (double face)
    AddTriangle(surf, v4, v5, v6)
    AddTriangle(surf, v4, v6, v7)
    AddTriangle(surf, v6, v5, v4) ; Face arrière
    AddTriangle(surf, v7, v6, v4) ; Face arrière
    
    ; Application de la couleur et transparence
    EntityColor mesh, r, g, b
    EntityAlpha mesh, alpha
    
    Return mesh
End Function