当原点不在网格上时,如何将网格/游戏对象放置在相机的 FoV 中间?

Posted

技术标签:

【中文标题】当原点不在网格上时,如何将网格/游戏对象放置在相机的 FoV 中间?【英文标题】:How to place a Mesh/gameObject in the middle of the camera's FoV when the origin is not on the mesh? 【发布时间】:2021-07-21 15:30:12 【问题描述】:

我正在制作一个 Unity 游戏,我需要在其中显示从摄像机 FoV 中心的服务器下载的 3D 模型,问题是某些模型在网格上没有枢轴,所以我的代码在这种情况下效果不佳:

    Vector3 positionInFront =  CameraCache.Main.transform.position + (CameraCache.Main.transform.forward * 1); 
    transform.position = positionInFront ;   

知道如何在不使用父母/更改层次结构的情况下解决此问题吗? 这解决了我的问题,但是当模型在 polycount 方面很大时,应用程序很难对层次结构进行更改:

    GameObject aux = new GameObject();
    aux.transform.position = targetCenter;
    transform.SetParent(aux.transform);
    aux.transform.position = positionInFront;
    transform.transform.SetParent(null);
    GameObject.Destroy(aux);

【问题讨论】:

可以添加一个对撞机并使用对撞机的中心吗? 【参考方案1】:

您可以使用几何中心,例如Renderer.bounds.center 以计算移动对象所需的增量向量,使中心最终位于目标位置,例如

// Model pivot in worldspace
var position = yourModel.position;
// Center if geometry in worldspace
var center = yourModel.GetComponent<Renderer>().bounds.center;
// vector from center to pivot
var centerToPositionDelta = position - center;
// Your target position in worldspace
var positionInFront =  CameraCache.Main.transform.position + CameraCache.Main.transform.forward * 1; 
// By adding the shifting vector center -> position
// you move the object just so the center ends up in the targetPosition
transform.position = positionInFront  + centerToPositionDelta;   

在智能手机上输入,但我希望思路清晰

【讨论】:

以上是关于当原点不在网格上时,如何将网格/游戏对象放置在相机的 FoV 中间?的主要内容,如果未能解决你的问题,请参考以下文章

Tilemaps 地图创建 1

如何在 PyQt 中使用网格定位?

块匹配游戏放置算法

unity如何快速选择网格筛除空对象

如何突出显示和检测 CSS 网格行上的鼠标点击?

有没有一种方法将GameObjects放置在网格模式中(类似于tilemap)?