gpt4 book ai didi

c# - 如何从 Render Texture 获取 3D 世界空间位置

转载 作者:太空狗 更新时间:2023-10-29 19:42:24 36 4
gpt4 key购买 nike

我正在使用 Render Texture制作侧面图,效果很好,我已经完成了这些步骤。

  1. 渲染场景的一个主摄像头。
  2. NGUI 相机渲染 GUI。
  3. 该 GUI 包含渲染纹理(迷你 map ),它使用 GUI 相机在纹理上渲染场景。

但是现在我想进一步改进 map 并希望它变得棘手。我想要渲染纹理点击点的世界空间位置。 有什么方法可以让我从渲染纹理的特定点击点获取世界空间位置?

如果我单击渲染纹理中的某处,我如何才能在 3D 世界空间中获取该点。

例如:我在 Render Texture 上单击了一个汽车对象。现在,如何在 3D 世界空间中突出显示或获取它。? 如何将 2D 渲染纹理点击位置转换为世界空间位置!

最佳答案

这假设了一些事情。

首先,我使用 EventSystems 获取鼠标点击。这不是必需的,它可以很容易地改变(尽管由你 ^^)。要正确设置它,您的场景中需要一个 EventSystem(如果您有 UI,您可能已经有了)。

其次,您需要将一个 PhysicsRaycaster 组件附加到您的主摄像头(玩家可以看到的摄像头)。

最后,在包含渲染纹理渲染器的 GameObject 上(我使用了一个简单的四边形),您应用以下脚本并分配相应的相机。

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);
}
}
}

编辑:上面可能有点冗长,如果你喜欢一个衬里,你可以轻松地减少它,它只是为了展示它是如何工作的。也请只将其视为概念证明,它没有经过全面测试

关于c# - 如何从 Render Texture 获取 3D 世界空间位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36858223/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com