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

创建正弦网格

在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()

绘制边线的算法

画一个线段与画三个线段相同,因此问题可以重述为:

How do you draw an arc on a sphere,

given two end points?

换句话说,在球体上的以下两个点之间绘制弧:

> P1 =(x1,y1,z1)

> P2 =(x2,y2,z2)

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

>计算球体的半径:

R = sqrt( x12 + y12 + z12 )

>计算P1和P2之间的线的中点(m):

Pm = (xm, ym, zm)

xm = (x1 + x2) / 2

ym = (y1 + y2) / 2

zm = (z1 + z2) / 2

>计算到P1和P2之间的线的中点的长度:

Lm = sqrt( xm2, ym2, zm2 )

>计算球体半径与中点长度的比值:

k = R / Lm

>计算沿圆弧的中点:

Am = k * Pm = (k * xm, k * ym, k * zm)

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

> P1到上午

>上午到P2

两个边缘将切入球体.要解决此问题,请计算P1Am和AmP2之间的中点.中点越多,线段将越接近球体的表面.

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

使用样条线

另一个解决方案是根据以下内容创建spline:

>球体的半径(如上计算)

> P1

>我

> P2

产生的样条曲线必须移到球体的前面.

搅拌器艺术家论坛

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

也可以看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值