Prob mit 2D zu 3D
Übersicht

GastBetreff: Prob mit 2D zu 3D |
![]() 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. ![]() ich hoffe ihr könnt mir helfen. |
||
AvaGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() 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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Doppelpost sucken ich weiss ich weiss ![]() ![]() ![]() 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 ![]() 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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht ist es ihm auch zu langsam ![]() Außerdem lernt man mit selbermachen viel. Dennoch sollte er nicht meine beste Freundin Ava anmachen ![]() |
||
MFG Darren |
![]() |
Terror-State |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
NescioBetreff: Mein Lösungsvorschlag |
![]() Antworten mit Zitat ![]() |
---|---|---|
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...) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group