Snap to Grid 3D

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Megamag

Betreff: Snap to Grid 3D

BeitragDi, Dez 14, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Forum! Very Happy
Und zwar geht es diesmal um einen Level-Editor, den ich gerade für mein Spiel schreibe. Das ganz ist in 3D und man soll auf einem Grid seine Sachen platzieren können. Dafür möchte ich aber gerne, dass jene Gegenstände sich dem Grid "anpassen". Damit meine ich, dass wenn man die Maus bewegt, die Gegenstände nicht auf der direkten Mausposition sind, sondern immer auf dem Knotenpunkt des Gitters.

Hier ist mal kurz die Ladefunktion des Grids:
BlitzBasic: [AUSKLAPPEN]
Local faktor = 128
grid_tex = CreateTexture( 512,512,12 )
SetBuffer TextureBuffer(grid_tex)
Color 0,255,0
For i = 0 To 512
For ii = 0 To 512
Rect i*faktor, ii*faktor, faktor, faktor, False
Next
Next
SetBuffer BackBuffer()

grid = CreatePlane()
EntityTexture grid,grid_tex
EntityBlend grid,1
EntityAlpha grid,1
EntityFX grid,1
PositionEntity grid,0,-2,0
EntityPickMode grid,2

node = CreateCylinder()
ScaleEntity node,.1,3,.1

"grid" ist das Model an sich, "grid_tex" ist seine Textur und "node" ist ein Test-Mesh, dass sich halt immer an den Knotenpunkt heften soll.

Hier ist mal meine Positionierung bis jetzt:
BlitzBasic: [AUSKLAPPEN]
pick = CameraPick(cam, MouseX(), MouseY()) 
If pick<>0 Then
ShowEntity node
PositionEntity node,PickedX(),PickedY(),PickedZ()
Else
HideEntity node
EndIf


Die funktioniert auch, ich steht nur gerade ein bischen auf dem Schlauch, wie ich da jetzt so eine "Snap"-Funktion mit rein bringen soll (Die Gittergröße ist mit der Variable "faktor" angegeben [siehe 1. Funktion]). Wäre toll, wenn mir da jemand helfen könnte!

,-Megamag
Mein DeviantArt Profil
Gewinner des BAC #136

mpmxyz

BeitragDi, Dez 14, 2010 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Man dividiert einfach die Position durch die Rastergröße, rundet und multipliziert dieses Zwischenergebnis mit der Rastergröße:
BlitzBasic: [AUSKLAPPEN]
Function MakeRaster#(x#,rasterSize#)
x=x/rasterSize
If x-Floor(x)<0.5
x=Floor(x) 'abrunden
Else
x=Ceil(x) 'aufrunden
EndIf
Return x*rasterSize
EndFunction

mfG
mpmxyz
PS: Der Code ist ungetestet und kann daher Fehler enthalten. Razz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Megamag

BeitragDi, Dez 14, 2010 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre ja alles kein Problem, aber die Rastergröße sind 2D-Koordinaten einer Textur, während die anderen Koordinaten die gepickten 3D-Koordinaten sind. Und dein Code würde ja nur klappen, wenn die Rastergröße in 3D-Koorinaten angegeben wäre.
Mein DeviantArt Profil
Gewinner des BAC #136

skey-z

BeitragDi, Dez 14, 2010 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten ist es ein Plane zu nehmen, darauf eine beliebig große Textur 32x32 oder so und dort nur einen Streifen am Rand einzeichnen(einrahmen).

In Blitz3D die Maus picken und diese in Integerwerten speichern oder beim plazieren Floats in Int konvertieren
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

ToeB

BeitragDi, Dez 14, 2010 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code von mpmxyz kann man einfacher schreiben :

BlitzBasic: [AUSKLAPPEN]
Function MakeRaster#(x#,rasterSize#)
Return Int( x / rasterSize )
EndFunction



mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Megamag

BeitragDi, Dez 14, 2010 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke skey-z und ToeB!
Nur ist das Problem immer noch das Selbe:
RasterSize ist die Rastergröße auf der Textur. Wenn ich jetzt also schreibe:
BlitzBasic: [AUSKLAPPEN]
MakeRaster(PickedX(),128)

Dann wird das nichts...

Daher bräuchte ich einen Lösungsansatz, um von den Textur-Koordinaten auf die 3D-Koordinaten zu kommen (oder meinetwagen auch einen ganz anderen Lösungsansatz Confused ). Ich kenne mich nämlich mit solchen Umrechnungen von dem einen in das andere Koodinatensystem leider überhaupt nicht aus.
Mein DeviantArt Profil
Gewinner des BAC #136

ToeB

BeitragMi, Dez 15, 2010 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst beachten, das der 3D Raum nicht in Pixel sondern in Units aufgeteilt ist, also musst du gucken wie viele Units die Textur groß ist und dann das raster dran anpassen Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Megamag

BeitragMi, Dez 15, 2010 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Und kann man das berechnen, oder muss ich das ausprobieren? Wink
Mein DeviantArt Profil
Gewinner des BAC #136

ToeB

BeitragMi, Dez 15, 2010 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, wenn du einfach EntityTexture machst ist egal bei welcher Größe die Texture immer auf 1/1/1 scalliert, benutz du ScaleTexture, musst du statt 1 nur noch den Faktor den du da eingegeben hast benutzen
BlitzBasic: [AUSKLAPPEN]
EntityTexture( Entity, Texture )
ScaleTexture( Texture, 2, 2 )

x# = SnapToGrid( PickedX(), 2 )


Wenns dann noch nich passt, einfach mit PositionTexture etc. rumspielen...


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group