选择球面上的像素坐标

问题描述 投票:0回答:2

我正在尝试获得球体上单击的像素位置。我使用了以下代码:

 if (Input.GetMouseButtonUp(0))
        {
            RaycastHit hit;
            if (!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
            {
                return;
            }
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Debug.DrawRay(ray.origin, ray.direction * 50000000, Color.red, 100f);
            Renderer renderer = hit.transform.GetComponent<Renderer>();
            MeshCollider meshCollider = hit.collider as MeshCollider;

            if(renderer == null || renderer.sharedMaterial == null || renderer.sharedMaterial.mainTexture == null || meshCollider == null)
            {
                return;
            }

            Texture2D tex = renderer.material.mainTexture as Texture2D;
            Vector2 pixelLocation = hit.textureCoord;
            pixelLocation.x *= tex.width;
            pixelLocation.y *= tex.height;

            //This line simply recolours the pixel at the above location to red.
            generator.DebugColorPixel((int)pixelLocation.x, (int)pixelLocation.y);
}

我遇到的问题是我在球体对象上也有以下脚本

void Update()
    {
        if (rotate)
        {
            transform.Rotate(Vector3.up, RotationSpeed * Time.deltaTime);
        }
    }

    private void OnMouseEnter()
    {
        rotate = false;
    }

    private void OnMouseExit()
    {
        rotate = true;
    }

问题是,如果在单击之前允许球体在任何点旋转(例如,rotationSpeed为大于0的任何值),则hit.textureCoord返回的坐标将不起作用。它们似乎沿x轴偏移。如果不允许球体旋转,则正确返回坐标。使用调试射线,我可以看到射线投射的正确位置,但是重新着色的像素不在射线投射的位置。

我对导致这种情况的原因感到困惑。

编辑:根据要求,重新着色代码为:

  Texture2D tex = (Texture2D)Sphere.materials[0].mainTexture;
    tex.SetPixel(x, y, Color.red);
    tex.Apply();
c# unity3d
2个回答
0
投票

为什么在raycast命中时不避免旋转:

if (Input.GetMouseButtonUp(0))
{
            RaycastHit hit;
            if (!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
            {
                return;
            }
            rotate = false;
            //do something with the pixel


            rotate = true;
}

0
投票

好,事实证明这是我该死的错。球体是一个空游戏对象的子对象,出于某种未知的原因,我过去将其缩放为2,2,1,这导致球体形状不正确,从而导致了这些问题!

© www.soinside.com 2019 - 2024. All rights reserved.