2016-04-26 4 views
8

Ich verwende Render Texture, um eine Side Map, es funktioniert gut und ich habe es durch diese Schritte gemacht.So erhalten Sie 3D-Welt Raumposition von Render Texture

  1. Eine Hauptkamera Rendern der Szene.
  2. NGUI-Kamera Rendering der GUI.
  3. Diese GUI enthält die Render Texture (Minikarte), die die Szene auf der Textur mit GUI Camera rendern.

Aber jetzt möchte ich die Karte weiter verbessern und will es hartnäckig machen. Ich möchte die Weltreposition von Render Texture Click Point. Gibt es eine Möglichkeit, dass ich die Weltraumposition aus dem spezifischen Klickpunkt der Rendertextur erhalte?

Wenn ich irgendwo in Render-Textur dann klicken, wie bekomme ich den Punkt im 3D-Welt Raum.

Zum Beispiel: Ich habe ein Auto-Objekt auf Render Texture geklickt. Nun, wie kann ich es im 3D-Weltbereich markieren oder bekommen? Wie kann man die 2D-Rendertext-Klickposition in World Space Position umwandeln!

+1

Zeigerinteraktionen treten nicht bei einzelnen Texturen auf, sie sind das Ergebnis eines Raycasts von der Kamera, die auf einen Collider trifft. Ihr Spielobjekt benötigt einen Collider, wenn Sie Unity5 verwenden, können Sie das EventSystem a [PhysicsRaycaster] (http://docs.unity3d.com/ScriptReference/EventSystems.PhysicsRaycaster.html) auf der Kamera und den [IPointClickHander] (http://docs.unity3d.com/ScriptReference/EventSystems.IPointerClickHandler.html) Schnittstelle – Rob

+0

Ich denke Raycast verwenden Physik und es gibt keine Physik auf die Kamera angewendet –

+0

Wie bekomme ich ich Welt Raumposition von Textur klicken? –

Antwort

4

Dies setzt einige Dinge voraus.

Zuerst verwende ich EventSystems, um Mausklicks zu erhalten. Dies ist keine Voraussetzung, es kann leicht geändert werden (durch Sie aber ^^). Um es richtig einzurichten, benötigen Sie eine EventSystem in Ihrer Szene (wenn Sie eine Benutzeroberfläche haben, haben Sie wahrscheinlich bereits eine).

Zweitens müssen Sie eine PhysicsRaycaster Komponente an Ihre Hauptkamera anschließen (die Kamera, die der Player durchschaut).

Zuletzt, auf dem GameObject, das den Renderer für die Render-Textur enthält (ich benutzte einen einfachen Quad), wenden Sie das folgende Skript an und weisen Sie die entsprechende Kamera zu.

using UnityEngine; 
using UnityEngine.EventSystems; 

//i chose box collider because its cheap 
[RequireComponent(typeof(BoxCollider))] 
public class RenderTextureRaycaster : MonoBehaviour, IPointerDownHandler { 

    //assign in inspector 
    public Camera portalExit; 

    BoxCollider portal; 
    Vector3 portalExitSize; 

    void Start() { 
     portal = GetComponent<BoxCollider>(); 
     //this is the target camera resolution, idk if there is another way to get it. 
     portalExitSize = new Vector3(portalExit.targetTexture.width, portalExit.targetTexture.height, 0); 
    } 

    public void OnPointerDown(PointerEventData eventData) { 
     //the click in world space 
     Vector3 worldClick = eventData.pointerCurrentRaycast.worldPosition; 
     //transformed into local space 
     Vector3 localClick = transform.InverseTransformPoint(worldClick); 
     //since the origin of the collider is in its center, we need to offset it by half its size to get it realtive to bottom left 
     Vector3 textureClick = localClick + portal.size/2; 
     //now we scale it up by the actual texture size which equals to the "camera resoution" 
     Vector3 rayOriginInCameraSpace = Vector3.Scale(textureClick, portalExitSize); 

     //with this knowledge we can creata a ray. 
     Ray portaledRay = portalExit.ScreenPointToRay(rayOriginInCameraSpace); 
     RaycastHit raycastHit; 

     //and cast it. 
     if (Physics.Raycast(portaledRay, out raycastHit)) { 
      Debug.DrawLine(portaledRay.origin, raycastHit.point, Color.blue, 4); 
     } 
     else { 
      Debug.DrawRay(portaledRay.origin, portaledRay.direction * 100, Color.red, 4); 
     } 
    } 
} 

edit: oben vielleicht ein bisschen ausführlicher ist, können Sie es leicht zu reduzieren, wenn Sie einen Liner mögen, es ist einfach zu zeigen, wie es funktioniert. bitte auch nur halte dies für einen Proof of Concept, es ist nicht gründlich getestet.

+0

Bitte erwähnen Sie alle Schritte und lassen Sie mich Sie aktualisiert, dass ich ein Bild habe, die Textur als Minikarte rendern. Von dieser Minikarte (2D) möchte ich die Weltraumposition erhalten. Wenn ich auf ein Bild klicke, wo ich dann die Position in der Szene bekomme. –

+0

hoffe diese klärung wird dir helfen! –

+0

Ihre diese Szene, die die Änderung in meiner hirarchy völlig verlangt –