ScreenToWorldPoint问题,否则真棒Unity演示

我正在使用Stack Overflow上的这个整齐的Unity演示,演示了通过RenderTexture进行纹理遮罩的过程:

你可以在Unity中实时擦除纹理吗?

但从鼠标位置到世界空间的映射是错误的。 这是映射的脚本:

using UnityEngine; using System.Collections; public class MaskCamera : MonoBehaviour { public Material EraserMaterial; private bool firstFrame; private Vector2? newHolePosition; private void CutHole(Vector2 imageSize, Vector2 imageLocalPosition) { Rect textureRect = new Rect(0.0f, 0.0f, 1.0f, 1.0f); Rect positionRect = new Rect( (imageLocalPosition.x - 0.5f * EraserMaterial.mainTexture.width) / imageSize.x, (imageLocalPosition.y - 0.5f * EraserMaterial.mainTexture.height) / imageSize.y, EraserMaterial.mainTexture.width / imageSize.x, EraserMaterial.mainTexture.height / imageSize.y ); GL.PushMatrix(); GL.LoadOrtho(); for (int i = 0; i < EraserMaterial.passCount; i++) { EraserMaterial.SetPass(i); GL.Begin(GL.QUADS); GL.Color(Color.white); GL.TexCoord2(textureRect.xMin, textureRect.yMax); GL.Vertex3(positionRect.xMin, positionRect.yMax, 0.0f); GL.TexCoord2(textureRect.xMax, textureRect.yMax); GL.Vertex3(positionRect.xMax, positionRect.yMax, 0.0f); GL.TexCoord2(textureRect.xMax, textureRect.yMin); GL.Vertex3(positionRect.xMax, positionRect.yMin, 0.0f); GL.TexCoord2(textureRect.xMin, textureRect.yMin); GL.Vertex3(positionRect.xMin, positionRect.yMin, 0.0f); GL.End(); } GL.PopMatrix(); } public void Start() { firstFrame = true; } public void Update() { newHolePosition = null; if (Input.GetMouseButton(0)) { Vector2 v = camera.ScreenToWorldPoint(Input.mousePosition); Rect worldRect = new Rect(-8.0f, -6.0f, 16.0f, 12.0f); if (worldRect.Contains(v)) newHolePosition = new Vector2(1600 * (vx - worldRect.xMin) / worldRect.width, 1200 * (vy - worldRect.yMin) / worldRect.height); } } public void OnPostRender() { if (firstFrame) { firstFrame = false; GL.Clear(false, true, new Color(0.0f, 0.0f, 0.0f, 0.0f)); } if (newHolePosition != null) CutHole(new Vector2(1600.0f, 1200.0f), newHolePosition.Value); } } 

我固定线49和50像这样:

 Vector2 v = GetComponent<Camera>().ScreenToWorldPoint(Input.mousePosition); Rect worldRect = new Rect(0.0f, 0.0f, 16.0f, 12.0f); 

所以脚本编译和worldRect现在是在正确的位置。 通过debugging,我发现49号线返回的世界坐标是closures的。 我也尝试将mousePosition的z值设置为10,即使相机是正交的,就像这样:

 Vector3 mousePos = Input.mousePosition; mousePos.z = 10; Vector2 v = GetComponent<Camera>().ScreenToWorldPoint(mousePos); 

虽然从鼠标到worldspace的映射依然是错误的。 在中心附近的小矩形内的鼠标坐标映射到世界空间中图像的全部宽度和高度。

确认! 好的,所以原始脚本中的摄像头指的是主摄像头,而不是附有脚本的摄像头。 第49行应如下所示:

 Vector2 v = Camera.main.ScreenToWorldPoint(Input.mousePosition); 

没有其他变化是必要的。