【发布时间】:2015-06-16 12:32:11
【问题描述】:
您好,我正在尝试获取纹理上的特定坐标(在鼠标光标下)。所以在我正在执行的鼠标事件中:
Ray outRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit clickRayHit = new RaycastHit();
if (!Physics.Raycast(outRay, out clickRayHit))
{
return;
}
Vector2 textureCoordinate = clickRayHit.textureCoord;
Texture2D objectTexture = gameObject.GetComponent<Renderer>().material.mainTexture as Texture2D;
int xCord = (int)(objectTexture.width * textureCoordinate.x);
int yCord = (int)(objectTexture.height * textureCoordinate.y);
但问题是我得到的坐标不是精确地在光标下,而是“有点接近它”。坐标并不是一直以一种方式移动,但移动也不是随机的。它们在纹理的不同点上移动不同,但是: 他们仍然在真实光标区域的某个地方 当光标在同一点上方时,坐标以相同的方式移动。
这是坐标日志的一部分:http://pastebin.ca/3029357
如果我对问题的描述不够好,我可以录制一个简短的截屏视频。
GameObject 是一个平面。
如果是相关的mouseEvent是windows mouseHook产生的。 (应用特定的东西)
我做错了什么?
UPD:我决定录制截屏视频 - https://youtu.be/LC71dAr_tCM?t=42。在这里,您可以通过我的应用程序看到 Paint 窗口图像。在左下角,您可以看到 Paint 正在显示鼠标的坐标(我以我之前描述的方式获取此坐标 - 纹理上点的位置)。所以当我移动鼠标光标时,你可以看到坐标是如何变化的。
UPD2:
我只想再强调一次,这种转变不是恒定的或线性的。鼠标坐标周围可能有“跳跃”(但不仅仅是跳跃)。上面的视频解释得更好。
【问题讨论】:
-
鼠标坐标日志对我们任何人都没有帮助。如果您在编辑器中说出您的 Canvas 设置,它会有所帮助:它是恒定像素大小还是随屏幕大小缩放?大多数这些问题都可以通过校正比例来解决。尝试使用 Debug.Log 写入 objectTexture.width 、 textureCoordinate.x 、 objectTexture.height 、 textureCoordinate.y 的值
-
我这里没有使用 Canvas。只是一个标准的 3d 对象 - 上面有纹理的平面。 objectTexture.height/width 在整个程序执行过程中保持不变。 textureCoordinate 的值发生跳跃
-
抱歉,我读到:“GameObject 是一个面板。”我的错。您的 3D 对象是否在任意轴上缩放?
-
是的,它在 x 和 z 轴上缩放。
-
尝试以 1 的比例运行它,你会发现这是否是问题所在。如果是,则必须将 textureCoordinate 与对象比例相乘。
标签: c# unity3d textures coordinates