【问题标题】:How to draw a spherical triangle on a sphere in 3D?如何在 3D 球体上绘制球形三角形?
【发布时间】:2011-03-11 11:52:16
【问题描述】:

假设您知道球面三角形的三个顶点。 那么如何在 3D 中绘制球体的边呢?

我需要一些 python 代码在 Blender 3d 建模软件中使用。

我已经在 Blender 中完成了 3D 球体。

谢谢,搅拌愉快。

注 1:

我在球体上有 3 个点/顶点 (p1,p2,p3 ) 用于球形三角形 但我需要在 3D 中跟踪球体上的边缘

那么确定球体上三角形的每个点对之间的所有顶点所需的方程是什么 从 p1 到 p2 的 3 条边 - p2 到 p3 和 o3 到 p1

我知道它与球体上测地线的大圆有关 但找不到合适的方程来进行球坐标计算!

谢谢


大圆圈

看到一个大圆的解决方案并直接在球坐标中查看解决方案会很有趣!

但在欧几里得空间中做这件事仍然很有趣

谢谢


好的,我使用了2点之间的线段的想法

但没有按照之前的指示去做

我使用了另一种方法 - 贝塞尔线插值**

我用贝塞尔线对线进行参数化 然后细分并计算为弦上每个细分贝塞尔点的比率和角度 而且效果非常好,非常精确

但是看看它是如何使用早期方法完成的会很有趣 但不确定如何进行迭代循环?

如何在此处加载 python 代码 只是用 Ctrl-V 过去?

感谢和快乐 2.5


我确实使用搅拌机论坛 但不能保证一直得到明确的答案!

这就是我在这里尝试的原因 - 抓住了机会

我做了第一个边缘似乎工作 现在必须做一个循环来获得第一条边的多段,然后也做其他边

2- 其他主题 我在这里打开一个关于贝塞尔三角形补丁的帖子 我知道这不是一个完整的工具 但只是为了展示它是如何完成的 你见过一个 python sript 来做这些 triangel 补丁吗 我确实在搅拌机的泡沫上问过这个问题,但没有回答 也在 IRC python 上,现在似乎已经死了 可能大家都忙着完成 2.5 Beta 版本,它应该在一周或 2 内发布

嘿,非常感谢这次数学讨论 如果我有问题明天再来

快乐数学和 2.5

【问题讨论】:

    标签: python blender


    【解决方案1】:

    一种廉价且简单的方法是创建三角形并将面细分到您想要的细节级别,然后将所有顶点标准化为您想要的半径。

    【讨论】:

    • 问题在于球坐标中的 3D 数学计算球体上三角形边的顶点位置函数的方程是什么?我知道这与大圆有关,但你如何计算这些大圆?谢谢
    • @Ricky:你不需要大圈子;您可以使用中点长度与球体半径的比率。
    【解决方案2】:

    创建正弦网格

    在 Blender 中创建正弦波网格的 Python 代码:

    import math
    import Blender
    from Blender import NMesh
    
    x = -1 * math.pi
    
    mesh = NMesh.GetRaw()
    vNew = NMesh.Vert( x, math.sin( x ), 0 )
    mesh.verts.append( vNew )
    
    while x < math.pi:
     x += 0.1
     vOld = vNew
     vNew = NMesh.Vert( x, math.sin( x ), 0 )
     mesh.verts.append( vNew )
     mesh.addEdge( vOld, vNew )
    
    NMesh.PutRaw( mesh, "SineWave", 1 )
    Blender.Redraw()
    

    代码说明在:http://davidjarvis.ca/blender/tutorial-04.shtml

    绘制边缘的算法

    画一条线段和画三条是一样的,所以问题可以重述为:

    如何在球体上画弧线, 给定两个端点?

    换句话说,在球体上的以下两点之间画一条弧:

    • P1 = (x1, y1, z1)
    • P2 = (x2, y2, z2)

    通过沿弧 P1P2 绘制多个中点来解决此问题,如下所示:

    1. 计算球体半径:
      R = sqrt( x12 + y12 + z12 )
      
    2. 计算P1和P2之间连线的中点(m):
      Pm = (xm, ym, zm)
      xm = (x1 + x2) / 2
      ym = (y1 + y2) / 2
      zm = (z1 + z2) / 2
    3. 计算到 P1 和 P2 之间连线中点的长度:
      Lm = sqrt( xm2, ym2, zm2 )
    4. 计算球体半径与中点长度的比值:
      k = R / Lm
    5. 沿圆弧计算中点:
      Am = k * Pm = (k * xm, k * ym, k * zm)

    对于 P1 到 P2,创建两条边:

    • P1 到 Am
    • Am 到 P2

    两条边将穿过球体。为了解决这个问题,计算 P1Am 和 AmP2 之间的中点。中点越多,线段越接近球体表面。

    由于 Blender 的计算相当精确,因此生成的弧很可能(渐近地)被球体隐藏。创建三角形网格后,将其从球体移开几个单位(例如 0.01 左右)。

    使用样条

    另一种解决方案是从以下内容创建spline

    • 球体半径(如上计算)
    • P1
    • A
    • P2

    生成的样条线必须移动到球体前面。

    Blender 艺术家论坛

    Blender experts 也会有解决这个问题的好主意;试着问他们。

    另见

    http://www.mathnews.uwaterloo.ca/Issues/mn11106/DotProduct.php

    http://cr4.globalspec.com/thread/27311/Urgent-Midpoint-of-Arc-formula

    【讨论】:

    • 我可以用python编程!我对确定 3D 球体上三角形边缘的数学方程有疑问,换句话说,你如何计算三角形每个边缘在球体上的顶点位置?希望现在很清楚谢谢
    • @Ricky:如果你还没有绘制三角形,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多