Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纯Python 3.6.3-查找两个3d向量之间的度数差异_Python_3d_Turtle Graphics_Normals - Fatal编程技术网

纯Python 3.6.3-查找两个3d向量之间的度数差异

纯Python 3.6.3-查找两个3d向量之间的度数差异,python,3d,turtle-graphics,normals,Python,3d,Turtle Graphics,Normals,出于某种不正当的原因,我正试图制作一个程序,用turtle库在纯python 3.6.3中显示线框图形。为了优化起见,我想跳过绘制不必要的TRI。不必要的TRI表示模型的其他部分应遮挡的TRI,即,法线朝向远离3d相机 程序正在处理的模型数据只是一个巨大的3d数组,每个tri的格式如下 [[Vert],[Vert],[Vert],[Normal]] 我当前版本的代码只有一个模型(立方体),如下所示: from turtle import * Cube = [[[-50,50,-50],[-5

出于某种不正当的原因,我正试图制作一个程序,用turtle库在纯python 3.6.3中显示线框图形。为了优化起见,我想跳过绘制不必要的TRI。不必要的TRI表示模型的其他部分应遮挡的TRI,即,法线朝向远离3d相机

程序正在处理的模型数据只是一个巨大的3d数组,每个tri的格式如下

[[Vert],[Vert],[Vert],[Normal]]
我当前版本的代码只有一个模型(立方体),如下所示:

from turtle import *

Cube = [[[-50,50,-50],[-50,50,50,],[50,50,50],[0,1,0]],
        [[-50,50,-50],[50,50,50,],[50,50,-50],[0,1,0]],
        [[-50,50,-50],[-50,50,50],[-50,-50,50],[1,0,0]],
        [[-50,50,-50],[-50,-50,-50],[-50,-50,50],[1,0,0]],
        [[-50,50,50],[50,50,50],[50,-50,50],[0,0,1]],
        [[-50,50,50],[50,-50,50],[-50,50,50],[0,0,1]],
        [[-50,-50,-50],[-50,-50,50,],[50,-50,50],[0,-1,0]],
        [[-50,-50,-50],[50,-50,50,],[50,-50,-50],[0,-1,0]],
        [[50,50,-50],[50,50,50],[50,-50,50],[-1,0,0]],
        [[50,50,-50],[50,-50,-50],[50,-50,50],[-1,0,0]],
        [[-50,50,-50],[50,50,-50],[50,-50,-50],[0,0,-1]],
        [[-50,50,-50],[50,-50,-50],[-50,50,-50],[0,0,-1]]]

CamVector = [0,1,0]

def DrawModel(Model):
    for i in range(0,len(Model)):
        goto(Model[i][0][0],Model[i][0][1])
        pd()
        goto(Model[i][1][0],Model[i][1][1])
        goto(Model[i][2][0],Model[i][2][1])
        goto(Model[i][0][0],Model[i][0][1])
        pu()

Model = Cube
DrawModel(Model)
def DrawModel(Model):
    for i in range(0,len(Model)):
        AngleAwayFromCamera = *Math voodoo*
        if AngleAwayFromCamera <= 90:
            *draw tri*
但我想将每个tri的法线与CamVector进行比较,因此代码最终如下所示:

from turtle import *

Cube = [[[-50,50,-50],[-50,50,50,],[50,50,50],[0,1,0]],
        [[-50,50,-50],[50,50,50,],[50,50,-50],[0,1,0]],
        [[-50,50,-50],[-50,50,50],[-50,-50,50],[1,0,0]],
        [[-50,50,-50],[-50,-50,-50],[-50,-50,50],[1,0,0]],
        [[-50,50,50],[50,50,50],[50,-50,50],[0,0,1]],
        [[-50,50,50],[50,-50,50],[-50,50,50],[0,0,1]],
        [[-50,-50,-50],[-50,-50,50,],[50,-50,50],[0,-1,0]],
        [[-50,-50,-50],[50,-50,50,],[50,-50,-50],[0,-1,0]],
        [[50,50,-50],[50,50,50],[50,-50,50],[-1,0,0]],
        [[50,50,-50],[50,-50,-50],[50,-50,50],[-1,0,0]],
        [[-50,50,-50],[50,50,-50],[50,-50,-50],[0,0,-1]],
        [[-50,50,-50],[50,-50,-50],[-50,50,-50],[0,0,-1]]]

CamVector = [0,1,0]

def DrawModel(Model):
    for i in range(0,len(Model)):
        goto(Model[i][0][0],Model[i][0][1])
        pd()
        goto(Model[i][1][0],Model[i][1][1])
        goto(Model[i][2][0],Model[i][2][1])
        goto(Model[i][0][0],Model[i][0][1])
        pu()

Model = Cube
DrawModel(Model)
def DrawModel(Model):
    for i in range(0,len(Model)):
        AngleAwayFromCamera = *Math voodoo*
        if AngleAwayFromCamera <= 90:
            *draw tri*
def DrawModel(型号):
对于范围(0,len(Model))中的i:
摄像机角度=*数学伏都教*

如果AngleAwayFromCamera没有太多的数学细节,那么数学中有一种叫做点积的东西:

基本上,这是一种将两个向量(分别称为ab)组合成一个数字的方法。这个数字等于a的大小乘以b的大小,再乘以它们之间夹角的余弦(我们称之为θ)

由于这个等式,通过改变事物,我们最终可以得到我们想要的东西,也就是θ

假设我们有a
[1,2,3]
b
[4,5,6]
。我们可以通过对它们的元素进行平方运算并取和的平方根来计算它们的大小。因此,a的大小是
(1**2+2**2+3**2)**0.5=14**0.5
b的大小是
(4**2+5**2+6**2)**0.5=77**0.5

将它们相乘得到
1078**0.5
。因此,点积等于
(1078**0.5)*cosθ

事实证明,点积可以通过将两个向量的对应元素相乘并将结果求和来计算。因此,对于上面的ab,点积是
1*4+2*5+3*6=32

给定这两个不同(但相等)的点积表达式,我们可以将它们等同于求解θ,如下所示(arccos是将cosθ转化为θ的函数):

现在,剩下的就是在代码中实现这一点:

from numpy import arccos

def angle_between_vectors(v1, v2):
    def magnitude(v):
        return sum(e ** 2 for e in v) ** 0.5

    dot_product = sum(e1 * e2 for e1, e2 in zip(v1, v2))
    magnitudes = magnitude(v1) * magnitude(v2)
    angle = arccos(dot_product / magnitudes)
    return angle

将此函数应用于上面的ab,并将弧度转换为度(除以π,乘以180),得到12.93,正如预期的那样。

总结一下,您是否希望能够解决求两个向量之间角度的一般问题,在每个三角形的法向量和摄像机向量的特定情况下?这几乎就是以一个3岁孩子可以得到的方式呈现的。向量的标量/点积除以向量的长度等于角度的余弦听起来可能很愚蠢,但向量不只是一个方向吗?它怎么会有长度?@ReesK矢量描述了如何从另一个点到达一个点。要做到这一点,你需要知道你要往哪个方向走,以及要走多远。