Prob mit 2D zu 3D

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Gast

Betreff: Prob mit 2D zu 3D

BeitragDo, März 18, 2004 9:01
Antworten mit Zitat
Hallo

ich habe ein problem ich möchte mit meiner maus 3D objekte auf einer plane verteilen können dafür müste ich aber die 2D Koordinate der Maus in die 3D Koordinate direkt auf der plane umrechnen nun wolte ich mal fragen ob jemand von euch weis wie ich das machen kann, da die Kamera in einem 45° Winkel auf die plane schaut weis ich net wie ich es machen soll. Embarassed

ich hoffe ihr könnt mir helfen.
 

Ava

Gast

BeitragDo, März 18, 2004 11:45
Antworten mit Zitat
Benutz am besten cameraPick(camera, mousex(), mousey()) und setz den EntityPickMode(Plane, 2) (oder 3 : dann müsstest Du noch EntityBox korrekt einstellen), dann kannst Du mit PickedX(), PickedY() und PickedZ() die 3D Position der Maus auf der Plane herausfinden!

Terror-State

BeitragSa, Jul 15, 2006 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich greif das Thema noch ma auf, denn ich find die Lösung im Post über mir absolut unbefriedigend. Eine selbstgeschriebene Funktion kann das schneller und effektiver. hab kein bock mein terrain mit pickmode zu belegen
Evil or Very Mad

Noch mal fürs Bewusstsein: Es geht um die Umrechnung der 2D Koordinaten in 3D Koordinaten


DUMM nur das ichs nicht hinkriege. Ich hab mir jetzt schon Programme geschrieben, die entstehende daten auswerten(vergleich mit campick-daten), hab skizzen gemacht und und und... Aber ich find keine verdammte Formel. Sad

Ich hoffe mit euer unterstützung könnte hier eine gute funktion für das codearchiv enstehen.

Wenn ihr das haben wollt was ich bis jetzt habe dann sagt einfach bescheid
Ob friedlich oder militant, wichtig ist der Widerstand

Terror-State

BeitragSa, Jul 15, 2006 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Doppelpost sucken ich weiss ich weiss Very Happy nehmts mir nich übel Wink

user posted image
Sieht chaotisch aus - is noch viel chaotischer. sry für meine paintkünte

Hier wird erstmal nur die X (eigentlich Z)-Koordinate berechnet. Die Maus wir in der Mitte des Bildschirms zentriert (dadurch hat die Mausposition keinen Einfluss auf die Testergebnisse)

Legende
Y: Höhe der Kamera (Standard 100, Testwert 50)
X: (eigentlich Z) Abstand der Kamera zum Zielpunkt
Zielpunkt: Rosa Fleck - die errechnete X(eigentlich Z) Koordinate
hellgrün:
Linie ist die Hypothenuse
Winkel ist der Standardwinkel (hier 45°)
blau: Zum testen wurde die Kamera auf Y=50 herruntergefahren. die Kamera ist jetzt auf X/2 gerichtet (logisch weil der winkel ja 45° ist)

dunkelgrün: Jetzt wie die Mausposition so geändert, das der Zielpunkt angepeilt wird.

orange: Es entsteht der zusätzliche Winkel "beta".


OMG ich verspreche ich werde niemals tutorials schreiben Laughing
Mein Problem ist, das ich den Winkel Beta nicht berechnet kriege, der aus der Veränderung der Mausposition hervorgeht...

Was sagt ihr zu diesen überlegungen? hilt euch das überhaupt?
Ob friedlich oder militant, wichtig ist der Widerstand

BladeRunner

Moderator

BeitragSa, Jul 15, 2006 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du ja schon weisst das Doppelposts sucken, dann unterlass sie in Zukunft bitte auch.
Der Editbutton ist für solche Fälle mehr als adäquat.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Willi die Rübe

BeitragSo, Jul 16, 2006 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@Terror-State: Wieso findest du die Pickmethode "absolut unbefriedigend"? Es ist der einfachste Weg und funktioniert Perfekt: Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

SetBuffer BackBuffer()

cam = CreateCamera()
PositionEntity cam, 0,5,-10

plane=Createplane()
EntityPickMode plane, 2

Cube=CreateCube()
EntityColor cube, 200,0,0


Repeat

  p=CameraPick(cam, MouseX(), MouseY())
  If p>0 Then
   PositionEntity cube, PickedX(), PickedY(), PickedZ()
  EndIf
 
 UpdateWorld
 RenderWorld
 Flip
Until KeyHit(1)


Außerdem glaube ich nicht, dass eine selbstgeschriebene Routine einen gravierenden Unterschied in der Schnelligkeit macht.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage
 

Darren

BeitragSo, Jul 16, 2006 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht ist es ihm auch zu langsam Rolling Eyes

Außerdem lernt man mit selbermachen viel.

Dennoch sollte er nicht meine beste Freundin Ava anmachen Razz
MFG Darren

Terror-State

BeitragSo, Jul 16, 2006 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Gedankenspiel: Die hast 200 Einheiten die du auswählen kannst.

Was ist komfortabler und schneller?
1.) Du rechnest die 3D-Position JEDER der 200 Einheiten mit CameraProject um. Und vergleichst dann mit den Eckpunkten deines Auswahlrechteckes

CameraProject Cam(0),u\X,0,u\Z
If ProjectedZ()
X = ProjectedX()
Y = ProjectedY()
...
...
Endif

ODER

2.) Du rechnest die Eckpunkten deines Auswahlrechteckes in 3D Koordinaten um um vergleichst diese mit jeder Einheit


Fazit: 2 Rechenoperationen OWNET mindestens 200 Rechenoperationen
Ne pas?

Die Sache ist ebenso effektiv wenn man Einheiten umherschicken will (CameraPick)

Edit : @Darren: War nicht meine Absicht. Sry falls das so ankam
@Terror-State: Aber irgendwie stimmt das auch nicht was du sagst... dein vergleich hinkt. die sache ist wohl nur, das du keinen bock hast dein scheiss terrain mit entitypickmode zu versehn...
Ob friedlich oder militant, wichtig ist der Widerstand

Willi die Rübe

BeitragSo, Jul 16, 2006 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube du hast was falsch verstanden, CameraProject hat nichts mit CameraPick zu tun. Schau mal in der OH nach, und such dir ein paar Beispiele.


Und nochwas in deiner Rechnung stimmt was nicht. Theorethich müssten es für die Methode mit CameraProject 200² (40000) Durchläufe sein, für CameraPick aber nur wenige. Und deine brauch auch mind. 200.

Beispiel gefällig?
Code: [AUSKLAPPEN]
Graphics3D 640,480,0,2
SetBuffer BackBuffer()

cam = CreateCamera()

SeedRnd MilliSecs()
HidePointer()

Dim cube(200)

For x=0 To 200
  cube(x) = CreateCube()
  PositionEntity cube(x) , Rand( -100 , 100 ) , Rand( -100 , 100 ) , 0
  EntityPickMode cube(x) , 3 , 1
Next


PositionEntity cam , 0 , 0 , -100


Global entity, oldentity

While Not KeyDown(1)

   mx = MouseX()
   my = MouseY()
   
   entity= CameraPick ( cam , mx , my )
   
    If entity=0  Then
     If oldentity <> 0 Then EntityColor oldentity ,  255, 255, 255
    ElseIf entity<>0 Then
         EntityColor entity, 0 ,255 ,0
         If oldentity<> entity And oldentity<>0 Then EntityColor oldentity, 255, 255 ,255
           oldentity=entity
      EndIf
   RenderWorld()

   Plot mx , my
   Text 10,10,"Ausgewähltes Objekt: "+entity
   Flip 0
Wend
End


Es werden 200 Quader zufällig plaziert. Wenn man mit der Maus drüber ist, wird der jeweilige Quader grün. Er werden keine zusätzlichen Schleifen benötigt, was wünscht man sich mehr?
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

Terror-State

BeitragSo, Jul 16, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Meister du hast mich falsch verstanden. Meinen Denkfehler hab ich ja mittlerweile eingesehn. Der Unterschied zur manuellen Variante is minimal/nichtig.

Aber ich hab einen enormen Fehler bei meinem Erläuterung gemacht also nochmal:

Du hast 200 Einheiten die die auswählen willst:

Statt die Position der Figuren mit CameraProject in 2D Koordinaten umzurechnen wäre es sinnvoller die Mauskoordinaten in 3D umzurechnen

Ich suche also die Umkehrfunktion zu CameraProject
Letzendlich hat also CameraPick absolut nichts mit meinem Problem zu tun
Oh man nicht mein Tag
Ob friedlich oder militant, wichtig ist der Widerstand

Willi die Rübe

BeitragSo, Jul 16, 2006 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Umkehrfunktion zu CameraProject gibt es nicht direkt, weshalb man ja mit CameraPick tricksen muss.

Aaaaalso der Befehl lautet:
entity=camerapick(x,y)

BlitzBasic prüft dann ob an der der Bildschirmkoordinate X,Y ein Entity ist. Wenn Ja, wird es in entity zurückgeliefert. Nun kann man entweder mit PickedX..Z prüfen, wo das Picking stattgefunden hat (sprich: hat man die Mauskoordinaten als x,y angegeben, hast du jetzt die 3D Koords) oder du prüfst mit EntityX(entity), wo sich das gepickte Mesh befindet. In deinem Falle ist CameraPick sogar ziemlich vorteilhaft, da du die Identität einer Einheit schon direkt zurückgeliefert bekommst und nicht mehr die 3D-Mausposition mit jeder einzelnen der 200 Einheiten vergleichen musst.
Also eigentlich kann man schon sagen, dass diese Funktion dann alle Forderungen erfüllt.

Und wie gewohnt nochmal ein Beispielcode:
Code: [AUSKLAPPEN]

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

cam = CreateCamera()

SeedRnd MilliSecs()
HidePointer()

Dim cube(200)

For x=0 To 200
  cube(x) = CreateCube()
  PositionEntity cube(x) , Rand( -100 , 100 ) , Rand( -100 , 100 ) , 0
  EntityPickMode cube(x) , 3 , 1
Next


PositionEntity cam , 0 , 0 , -100


Global entity, oldentity

While Not KeyDown(1)

   mx = MouseX()
   my = MouseY()
   
   entity= CameraPick ( cam , mx , my )
   
    If entity=0  Then
     If oldentity <> 0 Then EntityColor oldentity ,  255, 255, 255
     x=0 : y=0 : z=0
     px=0:py=0 :pz=0
    ElseIf entity<>0 Then
         EntityColor entity, 0 ,255 ,0
         x=entityX(entity) : y=entityY(entity) : z=entityZ(entity)
         If oldentity<> entity And oldentity<>0 Then EntityColor oldentity, 255, 255 ,255
           oldentity=entity
           px=PickedX()
           py=PickedY()
           pz=PickedZ()
      EndIf
   RenderWorld()
   Color 255,255,255
   Rect mx , my,2,2,1
   Color 200,0,0
   Text 10,10,"An der Mausposition "+mx+"x"+my+" befindet sich das Objekt: "+entity

    Text 10,25,"Gepicktes Obj an Pos X: "+x%
    Text 10,40,"Gepicktes Obj an Pos Y: "+y%
    Text 10,55,"Gepicktes Obj an Pos Z: "+z%
    Text 10,85,"Maus an 3DPos X: "+px
    Text 10,100,"Maus an 3DPos Y: "+py
    Text 10,115,"Maus an 3DPos Z: "+pz
   Flip 0
Wend
End


Falls ich es immer noch nicht verstanden habe bin ich nun total verwirrt Smile
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

Terror-State

BeitragSo, Jul 16, 2006 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mich damit schon beschäftigt... Ich bin sehr wohl in der Lage die OH zu lesen und ich füll michn bissel verarscht, weil es mir so vorkommt, als versucht du einem total bescheuerten etwas zu erklären Wink Und ich weiss das es keine Umkehrfunktion für CameraProject gibt. Was auch der Grund dafür ist, dass ich eine schreiben möchte... Und wenn es in die eine Richtung geht, dann muss doch der Umkehrschluss auch möglich sein. Richtig - Ja

Dein CamPick ist hier total fehl am Platz... Es liefert die Identität von einem Objekt, hilft aber gar nichts wenn ich durch ein Auswahlrechteck mehr als ein Objekt auswählen will...

Dafür wär es gut die EckPunkte (oben,rechts und unten,links) des Rechtecks in 3D-Koordinaten umzurechnen. Von der Fläche in die Ebene. und dann musst du nur noch über if anweisungen prüfen ob die aktuelle einheit in diesem viereck ist oder nicht?

einfacher gehtz nicht!!!!
Peace
Ob friedlich oder militant, wichtig ist der Widerstand

Fleamor

BeitragMo, Jul 17, 2006 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich finde du solltest bei der skizze nich versuchen Beta auszurechnen sondern die 2d Coordinate der maus umzurechnen.
Bin jetz nich so der Matheexperte aba für mich sieht die zahl 2 sehr interessant.
Wenn du nämlich mal guckst das du die 50 mit 2 multiplizierst dann bist du auf 100 und von 100 kommst du auf den gewünschten punkt und mit 100 ist es genauso.
war nur ne idee die mir durch den Kopf ging also nich ernstnehmen wenn es falsch ist
*schwupp* O.O

Nescio

Betreff: Mein Lösungsvorschlag

BeitragDo, Jul 27, 2006 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,

mein Lösungsvorschlag wäre ja, das Plane mit CameraPick zu "picken" und dann mit PickedX() und PickedZ() die Koordinaten errechnen zu lassen (Ungefähr Willis Idee).

Ungefähr so:
Code: [AUSKLAPPEN]

Graphics3D 1024,768
SetBuffer BackBuffer()

plane=CreatePlane()
EntityPickMode plane,2 ;<- Dafür sorgen, dass man Camerapick benutzen kann

tex=CreateTexture(16,16)
SetBuffer TextureBuffer(tex)
Color 0,0,255
Rect  0, 0,2,2
Rect 14, 0,2,2
Rect  0,14,2,2
Rect 14,14,2,2
SetBuffer BackBuffer()
EntityTexture plane,tex
EntityFX plane,1

Type objekt
   Field art
   Field X,Z
   Field obj
End Type

piv=CreatePivot()
cam=CreateCamera(piv)
PositionEntity cam,0,50,0
RotateEntity cam,45,0,0
CameraFogMode cam,1
CameraFogColor cam,0,0,255
CameraFogRange cam,50,300

cube=CreateCube()
EntityColor cube,0,255,0
HideEntity cube

sphere=CreateSphere(16)
EntityColor sphere,255,0,0
HideEntity sphere

Repeat

   MoveEntity piv,KeyDown(205)-KeyDown(203),0,KeyDown(200)-KeyDown(208)
   
   MX=MouseX()
   MY=MouseY()
   
   entity=CameraPick(cam,MX,MY) ;<- Liefert in jedem Fall das Plane zurück, weil das ja unendlich ist.
   
   If entity>0 Then
      X=PickedX() ;<- X-Koordinate auf Plane
      Z=PickedZ() ;<- Z-Koordinate auf Plane
   EndIf
   
   If entity>0 Then
      If MouseHit(1) Then
      
         Level.objekt=New objekt
         
         Level.objekt\art=1 ; Würfel
         Level.objekt\X=X
         Level.objekt\Z=Z
         
         ShowEntity cube
         Level.objekt\obj=CopyEntity(cube)
         HideEntity cube
         
         PositionEntity Level.objekt\obj,Level.objekt\X,1,Level.objekt\Z
         
      ElseIf MouseHit(2) Then
      
         Level.objekt=New objekt
         
         Level.objekt\art=2 ;Kugel
         Level.objekt\X=X
         Level.objekt\Z=Z
         
         ShowEntity sphere
         Level.objekt\obj=CopyEntity(sphere)
         HideEntity sphere
         
         PositionEntity Level.objekt\obj,Level.objekt\X,1,Level.objekt\Z
         
      EndIf
   EndIf
         
      
   Cls
   
   RenderWorld
   
   If entity>0 Then
      Text 10,10,X+","+Z
   EndIf
   
   Color 255,255,255           ;Und noch ein Fadenkreuz
   Line MX-5,MY,MX+5,MY
   Line MX,MY-5,MX,MY+5
   
   Flip
   
Until KeyHit(1)

End



Läuft eigentlich schnell genug.

Ich hab noch einen Typ angelegt, damit man die einzelnen Objekte noch ansprechen kann (zum speichern oder so...)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group