math - 透视圆形形状的实用方法?

标签 math 3d perspective

不完全确定这是否应该属于 Stack Overflow,但这里是。

我正在使用 HTML5 <canvas> 创建 3D 井字游戏的简单版本目的。第一个玩家使用十字符号,而第二个玩家使用圆形符号。关键是我不知道如何透视圆形。

目前,我使用的方法是创建一个具有尽可能多角度(但在一定程度上)的正多边形,通过在这些点之间绘制直线来伪造一个圆。我使用正弦/余弦计算了这些点(角度)的坐标。

使用 6 个角度:

enter image description here

使用 50 个角度(看起来足够像一个圆):

enter image description here

这很有效,但是需要相当多的点才能很好地伪造一个圆。而且,如果我创造一个球,我就会遇到更多麻烦。例如,维基百科上的图片显示,即使有很多点,它仍然会有一个相当“ block 状”的表面:http://en.wikipedia.org/wiki/File:Sphere_wireframe.svg

我想知道是否有任何方法可以更有效地透视圆形,也许不需要点,以便能够以更实用的方式创建逼真的圆形形状。

预先感谢您的任何建议。

最佳答案

圆的多边形近似是实用的方法。计算坐标并对它们应用透视变换非常简单。您可能应该坚持该解决方案。

也就是说,如果您对数学感兴趣,那么您正在考虑的兔子洞非常酷。事实证明,所有二次曲面(包括球体和椭圆形)都可以用 4x4 矩阵表示。不仅如此,一旦转换为 4x4,您就可以应用所有标准 4x4 变换矩阵(这不仅仅是乘法)。 IIRC 你甚至可以对它们应用透视变换,结果仍然是二次曲面。现在,这对您处理 3D 世界中的 2D 形状并没有多大帮助。但是,由于圆是圆柱体和平面的交集,并且两者都可以变换,因此应该有一个解决方案可以解决您的问题。

Here is a link describing the representation and transformations of quadrics

正如您所展示的,地面上圆的透视投影通常是屏幕空间中的旋转椭圆。我没有转换方法,但我相信存在一种转换方法,并且比您现在所拥有的更复杂。

关于math - 透视圆形形状的实用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900523/

相关文章:

javascript - 数组 数学逻辑 JavaScript

c - Opencl 数学 opencl 的新手尝试将 Octave 转换为 opencl 或 c 得到不同的结果

c# - 如何将平面上的 3D 点转换为 UV 坐标?

java - 尝试多个透视图时,RCP 中未加载透视图

c# - 将 double 值乘以 100.0 会引入舍入误差?

math - 四舍五入到最接近的奇数

math - 如何将世界坐标转换为相机坐标?

OpenGL 体素游戏 - 避免透明度重叠

css - perspective 和 translateZ 沿对 Angular 线移动

geometry - 透视投影: Proving that 1/z is Linear?