【问题标题】:How should I specify rectangles in a 3D scene?我应该如何在 3D 场景中指定矩形?
【发布时间】:2011-02-09 03:04:55
【问题描述】:

当渲染 3D 矩形(即 3D 空间中的矩形)时,当然,它们被指定为两个三角形的顶点列表。但是,该表示包含大量无关信息,多次编码会让人厌烦。我想创建一个“矩形”对象,它允许我指定它在空间中的纹理、大小、位置和方向,并导出顶点(和索引)列表,但我不确定最好的方法做。我应该指定左下角的位置(预旋转)还是矩形的中心?我应该如何将方向指定为包含旋转角度的向量?这是一个如此简单和标准的要求,我相信人们之前已经考虑过,但我在这个网站或其他地方找不到任何关于这个主题的东西。我计划大量使用这些对象,所以我的主要目标(除了性能)是易用性,而不是与内部表示有关。简单地编写我能想到的第一件事对我来说并不难,但我不想错过任何东西并使其变得不必要的困难。

那么,我应该如何表示一个 Rectangle 对象?欢迎提出意见,但来源会特别有帮助。

编辑:如果有帮助,我相信我会主要使用立方体表面上的矩形,尽管不一定作为这些立方体的整个表面。

【问题讨论】:

    标签: algorithm 3d


    【解决方案1】:

    存储将标准的轴对齐正方形转换到所需位置的齐次矩阵以及确定如何将纹理映射到其上的单独矩阵可能是最简单的。

    对于位置矩阵,可以存储不影响w-坐标的4x3矩阵。这只是有点多余:它使用 12 个值,而一般矩形需要 8 个值,但另一方面,将其转换回可用于渲染的形式会容易得多。

    或者,您可以存储一个点位置(边缘或中心,取决于最方便的方式)和两个方向向量,描述每个边缘的方向和长度;您依靠矩形生成器来确保边缘向量是正交的。这将需要 9 个值,这几乎是你能做的最好的了。

    对于纹理映射,您可以存储一个 3x2 矩阵,该矩阵定义了 (u,v) 坐标到由矩形边缘定义的坐标的仿射映射。您可以选择从零开始的 (0,1)x(0,1) 映射或对称 (-1,1)x(-1,1) 映射,具体取决于您的应用程序是否方便。无论如何,这将需要 6 个值。

    【讨论】:

      【解决方案2】:

      由于矩形只是一个有界平面,如何将其存储为它的扩展:一个点和一个法线向量(定义中心——或者可能是角之一——和方向);但是为宽度和高度边界再添加两个组件?

      【讨论】:

      • 这听起来很对,但是宽度和高度应该定义为从中心点向外延伸,还是应该在矩形的角上?
      • 数学+1。如果你有扎实的数学基础,编程会容易得多。
      • @tloflin:为什么不同时提供?这些值的访问器可以负责在该值和您的内部表示之间进行转换。
      • 我不确定这是否重要;但是使用该点作为角之一可能会使您对其他三个的计算更简单。
      • 您忘记了旋转。我建议将矩形的原点视为左下角(ala 数学)或左上角(ala 计算机图形学)。那么宽度和高度就是矩形的x 维度的长度和y 维度的高度。将旋转应用于xy 维度{1,0}{0,1},以使矩形围绕其原点处的法向量旋转。
      【解决方案3】:

      我认为这真的取决于你打算如何使用矩形。

      例如:如果你有很多矩形,存储两个三角形之一的三个点可能是最好的,因为你只需要再计算一个点。

      如果您通常将矩形居中在某个位置,则中心点、宽度、高度和旋转角度可能更合适。

      我想说:从对你来说自然而然的事情开始。确保您的班级能够进行所有必要的计算并将它们隐藏在访问器后面。有一套很好的测试。

      这样您就可以随时更改实现。或者你甚至可以针对不同的需求使用不同的矩形实现

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多