我正在尝试获得球体上单击的像素位置。我使用了以下代码:
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();
为什么在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;
}
好,事实证明这是我该死的错。球体是一个空游戏对象的子对象,出于某种未知的原因,我过去将其缩放为2,2,1,这导致球体形状不正确,从而导致了这些问题!