【问题标题】:How to move two objects with different distances in 3d camera but make it look orthographic如何在 3d 相机中移动具有不同距离的两个对象但使其看起来正交
【发布时间】:2021-03-24 02:06:15
【问题描述】:

我想不出要查找的数学类型,但这里有一张图表,显示了我拥有什么以及我想要什么:

Two objects in perspective vs. orthographic space

基本上,我有两个与相机距离不同的物体。我希望它们重叠,所以当一个移动时,另一个会移动。我正在使用透视相机,试图获得模拟的正交效果。我试图弄清楚这一点的原因是我希望能够在 3D 空间中单击并拖动某些东西并将其锁定到光标上,尽管距离不同。我尝试了许多不同的东西,但我对这种数学水平并不那么精通,我的搜索结果一无所获。我能想到的最好的是一些比例方程,但我也想不通。

白色十字准线按鼠标的增量位置移动,而不是使用 WorldToScreenPoint() 等 Camera 方法进行投影。

作为一个附带问题,这就是我最初尝试移动光标的方式;我怎样才能做到这一点?我在搜索中发现的任何东西似乎都不起作用。

非常感谢任何可以启发我的人!

【问题讨论】:

  • 你找到解决这个问题的方法了吗?

标签: c# unity3d


【解决方案1】:

您可以为此使用 InverseTransformPoint、WorldToScreenPoint 和 ScreenToWorldPoint。 cmets中的解释

// assign using method of choice such as with inspector
[SerializeField] Transform whiteTransform;
[SerializeField] Transform redTransform;

// assigned in code below
Camera mainCam;
[SerializeField] float redCrossHairDepth;

// some setup
void Start()
{
    // cache main camera;
    mainCam = Camera.main;

    // get "forward" distance between camera and red crosshair
    redCrossHairDepth = mainCam.transform
            .InverseTransformPoint(redTransform.position).z;
}


// call me after white position is set
private void SetRedCrossHairBasedOnWhite()
{    
    // get screen position of white crosshair
    Vector3 whiteScreenPos = mainCam.WorldToScreenPoint(whiteTransform.position);

    // assign the red crosshair depth to z component
    whiteScreenPos.z = redCrossHairDepth;

    // convert back to world space
    redTransform.position = mainCam.ScreenToWorldPoint(whiteScreenPos);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多