Jump to content
Unity Insider Forum

Mausposition in 3D-Position umrechnen


UnSpeed

Recommended Posts

Hey Leute,

 

sorry, aber besser kann ich den Titel nich beschreiben, wenn jemand einen passenderen findet, feel free!

 

Zu meinem Vorhaben:

Die Szene ist ein Blick auf einen Tisch vpn schräg oben, statische Kamera (Später evtl. nicht mehr). Auf dem Tisch befinden sich verschiedene Gegenstände, die mittels Maus bewegt werden können sollen.

Also OnMouseDown() - Objekt wird aufgehoben, OnMouseUp() - Objekt wird fallengelassen.

Code dazu:

#pragma strict
var rb : Rigidbody;
var grabbed = false;
var pickUpHeight : float;
function OnMouseDown()
{
Debug.Log("Clicked");
grabbed = true;
}
function OnMouseUp()
{
Debug.Log("UnClicked");
grabbed = false;
}
function setPickUpHeight()
{
pickUpHeight = 0.5;
}
function Start () {
rb = GetComponent.<Rigidbody>();
setPickUpHeight();
}
function Update ()
{
if (grabbed)
{
 rb.useGravity = false;
 while(pickUpHeight > 0)
 {
  this.transform.Translate(Vector3.up*Time.deltaTime*2);
  pickUpHeight -= Time.deltaTime*2;
 }
}
else
{
 rb.useGravity = true;
 setPickUpHeight();
}
}

 

Das ist nicht der beste Code, ich weiß. Aber er funktioniert ganz gut, deshalb werde ich ihn wahrscheinlich erst später überarbeiten.

 

So, jetzt das Problem:

Wenn der Gegenstand aufgehoben worden ist, soll man ihn mit der Maus verschieben können und zwar so, dass die Mousebewegung perspektivisch umgerechnet wird... wird das klar?! :/

Meine Idee war, irgendwie zu ermitteln, worauf die Maus zeigt, da es möglich ist, zu erkennen, ob die Maus über einem Objekt ist, dachte ich mir, dass es auch sein könnte, dass man ermitteln kann WO GENAU sich die Maus über einem Objekt befindet.

Ich bin für jeden Tip und jede Hilfe dankbar!

 

Danke,

UnSpeed

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wow, die ganze Zeit im Internet gesucht und nichts gefunden.

 

Jetzt, nachdem ich das Thema erstellt habe, habe ich natürlich parallel weitergesucht und jetzt habe ich etwas gefunden.

 

Für alle, die ein ähnliches Problem haben:

http://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Versuch es mal mit Raycast damit könntest du schon mal weiter kommen Du kannst das ungefähr so verstehen das do von der Mouseposition einen Strahl in dein Spiel malst bis dieser Strahl etwas trifft und der 3D Punkt wird dir dann zurück gegeben

 

Ray ray = camera.main.ScreenViewPoint(mouseposition);
if(phiysics.Raycast(ray, out hit, distance))
{
    Vector3 3dMouseposition = hit.point;
}

 

(Der Code ist jetzt so aus dem Kopf und eventuel fehlerhaft aber ich denke den zu korregieren wird kein Problem sein.)

 

Und dann musst du nur noch das Layer deines Objektes was du bewegt den Raycast ignorieren. Kannst du irgenwo einstellen. Dann wird ich die Position nehmen und sie deinem Obejkt geben.

 

Probier mal ein bisle damit rum, ich hoffe das hilft dir weiter??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, erstmal vielen Dank für den Tip, das hat super funktioniert!

 

Deshalb präsentiere ich hier mal die Lösung, damit andere das auch so schnell hinbekommen:

 

#pragma strict
var rb : Rigidbody;
var grabbed = false;
var pickUpHeight : float;
function OnMouseDown()
{
grabbed = true;
}
function OnMouseUp()
{
grabbed = false;
}
function setPickUpHeight()
{
pickUpHeight = 0.5;
}
function Start () {
rb = GetComponent.<Rigidbody>();
setPickUpHeight();
}
function updateCoordsFromMouse()
{
var hit : RaycastHit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, hit,1<<8))
{
 transform.position = Vector3(hit.point.x,transform.position.y,hit.point.z);
}
}
function Update ()
{
if (grabbed)
{
 updateCoordsFromMouse();
 rb.useGravity = false;
 while(pickUpHeight > 0)
 {
  this.transform.Translate(Vector3.up*Time.deltaTime*2);
  pickUpHeight -= Time.deltaTime*2;
 }
}
else
{
 rb.useGravity = true;
 setPickUpHeight();
}
}

 

Dabei ist die Methode updateCoordsFromMouse() der Knackpunkt

 

function updateCoordsFromMouse()
{
var hit : RaycastHit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, hit,1<<8))
{
 transform.position = Vector3(hit.point.x,transform.position.y,hit.point.z);
}
}

 

Das dritte Argument von Raycast ist "1<<8". Das ist ein User Layer, den ich erstellt habe

(Rechts Oben und Layers, dann Edit Layer und dann einen eintragen)

Ich habe eine Plane erstellt, die den Layer bekommen hat und da das der achte Layer ist, wird nur dieser in die Raycast-Berechnung einbezogen.

 

Nochmals danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...