如何在3D球体上绘制球形三角形?

时间:2010-07-03 19:03:05

标签: python blender

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

我需要一些python代码才能在Blender 3d模型化软件中使用。

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

谢谢&快乐的搅拌。

注1:

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

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

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

由于


大圆圈

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

但在euclidiens空间中仍然很有趣

谢谢


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

但没有像之前所说的那样做

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

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

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

如何在这里加载python代码 刚刚用Ctrl-V过去了吗?

谢谢,快乐2.5


我确实使用了搅拌机的论坛 但是没有任何保证可以一直得到明确的答案!

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

我做的第一个优势似乎有效 现在必须做一个循环来获得第一个边缘的多段,然后再做其他边缘

2-其他科目   我在这里打开一个关于bezier三角形补丁的帖子  我知道这不是一个usfull工具 但只是为了说明它是如何完成的 youeseen python sript做theses triangel补丁 而且我确实在搅拌机的问题上问这个问题而没有答案 同样在IRC python和sems现在已经死了 可能有些人太忙于完成2.5 Beta版本,这应该在一周或2周内完成 嘿,非常感谢这次数学讨论 如果我有问题明天回来

快乐的数学和2.5

2 个答案:

答案 0 :(得分:4)

创建正弦网格

在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

绘制边缘的算法

绘制一个线段与绘制三个相同,因此问题可以重写为:

  

如何在球体上绘制圆弧,   给出两个终点?

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

  • P 1 =(x 1 ,y 1 ,z 1
  • P 2 =(x 2 ,y 2 ,z 2

通过绘制沿着圆弧P 1 P 2 的许多中点来解决这个问题,如下所示:

  1. 计算球体的半径:
    R = sqrt( x12 + y12 + z12 )
    
  2. 计算P 1 与P 2 之间的直线的中点( m ):
    Pm = (xm, ym, zm)
    xm = (x1 + x2) / 2
    ym = (y1 + y2) / 2
    zm = (z1 + z2) / 2
  3. 计算P 1 与P 2 之间的直线中点的长度:
    Lm = sqrt( xm2, ym2, zm2 )
  4. 计算球体半径与中点长度的比率:
    k = R / Lm
  5. 沿弧线计算中点:
    Am = k * Pm = (k * xm, k * ym, k * zm)
  6. 对于P 1 到P 2 ,创建两条边:

    • P 1 到A m
    • m 到P 2

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

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

    使用样条线

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

    • 球体的半径(按上面计算)
    • P <子> 1
    • A <子>米
    • P <子> 2

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

    Blender Artists论坛

    Blender experts对如何解决这个问题也有很好的想法;试着问他们。

    另见

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

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

答案 1 :(得分:0)

这样做的一种便宜而简单的方法是创建三角形并将面细分到所需的细节级别,然后将所有顶点标准化为所需的半径。