【问题标题】:3D Perspective Projection doesn't look right3D 透视投影看起来不正确
【发布时间】:2012-04-28 02:12:55
【问题描述】:

我一直在使用3D透视投影公式:

sx = wx*scale/wz
sy = wy*scale/wz

它可以投射一些东西,但是例如一个立方体看起来更像一个矩形棱柱并且真的被拉伸了。

看起来像这样:

我已经对它进行了研究,并在 stackoverflow 上查看了它的其他页面,但我真的不明白为什么它会延长它。

我还尝试了其他替代方法,例如将 z 值除以 2 或 4,或使用一些任意值使其看起来更像立方体,但对于更复杂的对象,它并不能真正起到作用。

感谢任何帮助。

谢谢。

【问题讨论】:

  • 立方体的8个世界坐标是多少?你得到了什么作为屏幕坐标?
  • @SteveH 是的,我已经读过了。不久前我从另一个网站得到了公式。我刚决定重新开始做 3D 的东西。
  • @Alex 我没有做一个完整的立方体,只是三个面。立方体的坐标是:front = (5,5,5),(0,5,5),(0,10,5),(5,10,5),(5,5,5) right = (5,5,5),(5,5,10),(5,10,10),(5,10,5),(5,5,5) 左 = (0,5,5),( 0,5,10),(0,10,10),(0,10,5),(0,5,5)
  • 我认为它离相机太近了,对于小的不同 z 来说,1/z 是非常不同的。把它移远一点。

标签: 3d projection cube perspective


【解决方案1】:

您的投影看起来像极广角视图。这是一个“正确”的透视投影 - 您的公式是正确的,但关键在于 scale 变量/常量。

scale的值一般为

screen_width_in_pixels * focal_length

其中focal_length 是观看者眼睛到屏幕的距离与屏幕宽度的比值。当然,您无法控制某人坐在显示器前的距离,所以您猜。 1.0 - 1.5 通常是一个不错的范围。

当您将该值更改为不那么广角时,副作用将是“相机”将“放大”您的对象,并可能填满屏幕。因此,您需要通过将对象移离相机更远来进行补偿。

(当然)有很长的Wikipedia article on the subject

【讨论】:

  • 感谢您的回复。我试过你的缩放方法,但它看起来仍然被拉长了。它看起来和以前差不多。关于我可以改变什么来阻止它伸展的任何想法?
  • 检查您的坐标。这些实际上是立方体的面吗?
【解决方案2】:

尝试在 html5 的画布上渲染一个框时,我遇到了同样的“问题”。使拉伸框对我来说看起来“正常”的原因是将相机位置 的 z 值设置为 -250 而不是我使用的 -50。然后,根据您用于计算 x,y 坐标的公式,您可以调整观察者的 z 位置 (ez)

或从记录表面到入射光瞳 (rz) 的距离以放大您的对象。

我知道这个问题是半年前提出的,但由于我找不到任何对我有帮助的答案,所以我决定分享我自己的经验。希望它可以帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2013-11-26
    • 2018-07-15
    相关资源
    最近更新 更多