[Blitz 3D] Hohlzylinder (Rohr erstellen (auch teilweise)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

AMY

Betreff: [Blitz 3D] Hohlzylinder (Rohr erstellen (auch teilweise)

BeitragDo, Jan 19, 2017 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal ein Funktion geschrieben mit der man einfach ein Rohr oder auch nur Abschnitte davon erstellen kann.
Da ich ungerne mit Modellierprogrammen arbeite, und man sowas ja doch mal brauchen kann, ist dies (zumindest für mich) eine große Bereicherung.

Ich habe noch die zweite Funktion zu Erstellung einer Scheibe ebenfalls mit Loch (also ein 2 Dimensionales Objekt) mit eingefügt, damit man dies auch für 2D-Spiele unter B3D verwenden kann.

Würde mich über Feedback freuen.

BlitzBasic: [AUSKLAPPEN]
Graphics3D(1920,1080,32,2)
camera=CreateCamera()
camlight=CreateLight(2,camera)
MoveMouse 400,300

;######################################################
;Funktionsparameter
;CreateCylinderPart(Aussenradius,Innenradius,Rohrabschnitt 1-360,[Detailstufe=80] 1-100)
;###########################

;###########################
;CreateCylinderPart erstellt ein RAW-Objekt wie z.B. CreateCube()
;Für eine Texturierung müssen noch die TextureCoords eingegeben werden
;######################################################

Function CreateCirclePart(aussenradius,innenradius,degrees)
CP=CreatePivot()
mesh=CreateMesh()
surface=CreateSurface(mesh)
Local VertexPoints[360];360grad * 4 ecken pro abschnitt
For I=0 To degrees
MoveEntity CP,aussenradius,0,0
VertexPoints[I]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-(aussenradius-innenradius),0,0
VertexPoints[I+degrees]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-innenradius,0,0
TurnEntity CP,0,1,0
Next

For I=1 To degrees-1
AddTriangle(surface,VertexPoints[I],VertexPoints[I+1],VertexPoints[I+1+degrees])
AddTriangle(surface,VertexPoints[I],VertexPoints[I+1+degrees],VertexPoints[I+degrees])
Next
Return mesh
End Function
Function CreateCylinderPart(aussenradius,innenradius,degrees,detail=80);1-100 empfohlen nicht unter 30
detail=101-detail
;VertexPoints 0-359 Aussenpunkte Vorne
;VertexPoints 360-719 Innenpunkte Vorne
;VertexPoints 720-1079 Aussenpunkte Hinten
;VertexPoints 1080-1439 Innenpunkte Hinten
CP=CreatePivot()
PositionEntity CP,0,-1,0
mesh=CreateMesh()
surface=CreateSurface(mesh)
Local VertexPoints[1440];360grad * 4 ecken pro abschnitt
For I=0 To degrees/detail
MoveEntity CP,aussenradius,0,0
VertexPoints[I]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-(aussenradius-innenradius),0,0
VertexPoints[I+(360)]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-innenradius,0,0
TurnEntity CP,0,detail,0
Next
PositionEntity CP,0,1,0
RotateEntity CP,0,0,0
For I=720 To 720+(degrees/detail)
MoveEntity CP,aussenradius,0,0
VertexPoints[I]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-(aussenradius-innenradius),0,0
VertexPoints[I+360]=AddVertex(surface,EntityX(CP),EntityY(CP),EntityZ(CP))
MoveEntity CP,-innenradius,0,0
TurnEntity CP,0,detail,0
Next
For I=0 To (degrees/detail)-1
AddTriangle(surface,VertexPoints[I],VertexPoints[I+1],VertexPoints[I+1+360])
AddTriangle(surface,VertexPoints[I],VertexPoints[I+1+360],VertexPoints[I+360])
AddTriangle(surface,VertexPoints[I+720],VertexPoints[I+1+360+720],VertexPoints[I+1+720])
AddTriangle(surface,VertexPoints[I+720],VertexPoints[I+360+720],VertexPoints[I+1+360+720])
AddTriangle(surface,VertexPoints[I],VertexPoints[I+720+1],VertexPoints[I+1])
AddTriangle(surface,VertexPoints[I],VertexPoints[I+720],VertexPoints[I+720+1])
AddTriangle(surface,VertexPoints[I+360],VertexPoints[I+360+1],VertexPoints[I+360+1+720])
AddTriangle(surface,VertexPoints[I+360],VertexPoints[I+360+1+720],VertexPoints[I+360+720])
Next

AddTriangle(surface,VertexPoints[0],VertexPoints[360],VertexPoints[1080])
AddTriangle(surface,VertexPoints[0],VertexPoints[1080],VertexPoints[720])

AddTriangle(surface,VertexPoints[0+(degrees/detail)],VertexPoints[1080+(degrees/detail)],VertexPoints[360+(degrees/detail)])
AddTriangle(surface,VertexPoints[0+(degrees/detail)],VertexPoints[720+(degrees/detail)],VertexPoints[1080+(degrees/detail)])

Return mesh
End Function

;######################################################
;
;Die folgenden Codezeilen sind nur zur einfachen Demonstration gedacht
;
;###########################
;
;WASD - Bewegen
;1 (Zahlenleiste) - Wireframe-Umschaltung
;
;######################################################

f=CreateCylinderPart(10,8,180,100)
g=CreateCylinderPart(10,4,180,100)
h=CreateCylinderPart(6,1,180,100)
i=CreateCylinderPart(10,0,180,100)
j=CreateCylinderPart(10,9,180,100)

PositionEntity f,00,0,30
PositionEntity g,25,0,30
PositionEntity h,50,0,30
PositionEntity i,75,0,30
PositionEntity j,100,0,30

ScaleEntity f,1,10,1
ScaleEntity g,1,10,1
ScaleEntity h,1,10,1
ScaleEntity i,1,10,1
ScaleEntity j,1,10,1

Repeat
Movement(camera,1,0.1)
If KeyHit(2) Then WFMode=1-WFMode
WireFrame WFMode
RenderWorld
Text 0,0,TrisRendered()
Text 0,20,scale
Flip
Until KeyDown(1)
End



Function Movement(camera,speedfast#=3,speedslow#=1)
mspeedx=MouseXSpeed()
mspeedy=MouseYSpeed()
msensivityX#=mspeedx/2
msensivityY#=mspeedy/2
If mspeedy<>0 Then TurnEntity camera,msensivityy,0 ,0
If mspeedx<>0 Then TurnEntity camera,0,-msensivityX,0
If KeyDown(54) Or KeyDown(42) Then movespeed#=speedslow Else movespeed=speedfast
If KeyDown(32)=True Then MoveEntity camera, movespeed, 0, 0;205
If KeyDown(30)=True Then MoveEntity camera,-movespeed, 0, 0;203
If KeyDown(201)=True Then MoveEntity camera, 0, movespeed, 0;201
If KeyDown(209)=True Then MoveEntity camera, 0,-movespeed, 0;209
If KeyDown(31)=True Then MoveEntity camera, 0, 0,-movespeed;208
If KeyDown(17)=True Then MoveEntity camera, 0, 0, movespeed;200
MoveMouse 512,384
End Function


user posted image
  • Zuletzt bearbeitet von AMY am Mo, Apr 10, 2017 1:41, insgesamt 4-mal bearbeitet
 

Sirrus

BeitragMo, Apr 10, 2017 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Idee an sich ist gut, nur die Umsetzung ist ziemlich bescheiden ausgefallen. Da du nur ein Licht und keine Textur verwendest kann man kaum was erkennen (nur 5 graue Objekte auf schwarzen Hintergrund ohne WireFrame sieht man kaum, dass es 3D-Objekte sind)
Auch die Steuerung ist etwas dürftig ausgefallen, zumal man ohne Hinweis auf die nutzbaren Tasten erst mal im Code nachschauen muss,welche Steuerungen vorgesehen sind und da stehen auch nur Scancodes. verwende doch wenigsten Konstanten für die Skancodes

Ich werde dir dafür mal was basteln...
Type-Spezialist (es geht mehr mit Types, als die meisten glauben)
 

Sirrus

BeitragMo, Apr 10, 2017 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, Korrektur!
Hab deine WireFrame-Umschaltung gefunden (hatte ich zuerst übersehen, weil die nicht da war, wo die anderen Tastaturabfragen sind)

Aber du machst ja nur Vierkant-Rohre....
Type-Spezialist (es geht mehr mit Types, als die meisten glauben)

AMY

BeitragMo, Apr 10, 2017 1:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für das Feedback.
Das meine Codes ein paar Kommentare vertragen können dessen bin ich mir bewusst, allerdings ist es für mich nicht einfach immer alles in Worte zu fassen. Ich habe aber mal Grundlegende Sachen jetzt hoffentlich ausreichen Kommentiert. Für mehr Feedback bin ich immer dankbar.

Zur Steuerung: In vielen 3D-Anwendungen hat sich die WASD Steuerung etabliert und daher sah ich keine Notwendigkeit dies zu erläutern. Soweit ich weiß geht es hier im Codearchiv auch mehr um die vorgestellten Funktionen an sich und nicht um das drumherum, das ich der Einfachheit mit hinzugepackt habe.
Zudem habe ich nicht das Bedürfnis Konstanten für Scancodes zu verwenden, dazu gibt es genügend Bespiele und Downloads im Archiv die ich bisher aber nicht, als für mich essentiell ansehe. Wer es dennoch abändern will kann dies für sich natürlich gerne tun.

Vierkant Rohre? Ich weiß leider nicht was du damit meinst. Das einzige was mir dazu einfällt ist das du den 4 Parameterwert der Funktion der Optional ist (Standardwert 80) auf einen wert von 80 und höher setzt. Solche Vierkantrohre entstehen soweit ich weiß nur bei niedrigem Detaillevel unter 50. Falls das nicht das ist was du meinst würde ich mich über ein weiteres Feedback freuen.
Projekte: www.amyscbi.de , Wallpapers: www.wallpapers.berlin
 

Sirrus

BeitragMo, Apr 10, 2017 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei der Function "CreateCirclePart" fehlt am Ende "Return Mesh"
Type-Spezialist (es geht mehr mit Types, als die meisten glauben)

AMY

BeitragMo, Apr 10, 2017 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe ich soeben behoben. Danke für den Hinweis.
Projekte: www.amyscbi.de , Wallpapers: www.wallpapers.berlin
 

Sirrus

BeitragMo, Apr 10, 2017 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Vierkant-Rohre meinte ich, dass deine Rohre einen quadratischen oder rechteckigen Querschnitt haben
Type-Spezialist (es geht mehr mit Types, als die meisten glauben)

AMY

BeitragMo, Apr 10, 2017 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Das habe ich mir gedacht und dir schon oben darauf geantwortet. Wie man auch im Bild erkennen kann sind Rohre die mit einem hohen Detailwert erstellt werden keine Vierkantrohre. Auf dem Bild sind Halbrohre mit dem Detailstufe 100 zu sehen.
Projekte: www.amyscbi.de , Wallpapers: www.wallpapers.berlin
 

Sirrus

BeitragMo, Apr 10, 2017 2:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so war das mit den Rohren gedacht. Du hast also Teilstücke von einem geraden Rohr. So wie das Programm zuerst war, hatte ich das für Rohrbogen eines Vierkantrohrs gehalten.

Ich kenn das mit dem WASD oder Cursor-Tasten, aber sowas wirst du in meinen Programmen vergeblich suchen. Ich steuer möglichst alles mit der Maus, weil ich nicht so gern tippe. Very Happy
Type-Spezialist (es geht mehr mit Types, als die meisten glauben)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group