Py学习  »  Python

Pure Python 3.6.3-查找两个三维向量之间的度数差异

Rees K • 5 年前 • 1558 次点击  

出于一些不虔诚的原因,我试图用Turtle库制作一个纯Python3.6.3的线框图形显示程序。我已经到了一个地步,我想跳过绘制不必要的tris优化的目的。不必要的tris意味着tris应该被模型的其他部分遮住,也就是说,从三维相机的正常面对。

程序正在处理的模型数据只是一个巨大的三维数组,每个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)

但是我想把每个tri的法向和camvector进行比较,这样代码就变成这样了:

def DrawModel(Model):
    for i in range(0,len(Model)):
        AngleAwayFromCamera = *Math voodoo*
        if AngleAwayFromCamera <= 90:
            *draw tri*

如果有人对如何帮助有任何想法,可以向像我这样有核桃大小大脑的人解释,那就太好了。我看了很多文件,但大多数都飞到了我的头上——可能是因为我没有通过GCSE数学考试。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/42903
 
1558 次点击  
文章 [ 1 ]  |  最新文章 5 年前
gmds
Reply   •   1 楼
gmds    6 年前

在不太深入数学细节的情况下,有一种叫做 点积 数学方面:

enter image description here

基本上,这是一种组合两个向量的方法(称为 )得到一个号码。这个数字等于 ,乘以 ,乘以它们之间夹角的余弦(我们称之为)。

多亏了这个等式,通过改变事物,我们最终可以得到我们想要的,也就是。

说我们有 : [1, 2, 3] : [4, 5, 6] . 我们可以通过平方它们的元素并取和的平方根来计算它们的大小。因此, (1 ** 2 + 2 ** 2 + 3 ** 2) ** 0.5 = 14 ** 0.5 ,以及 (4 ** 2 + 5 ** 2 + 6 ** 2) ** 0.5 = 77 ** 0.5 .

把它们相乘给我们 1078 ** 0.5 . 因此,点积等于 (1078 ** 0.5) * cos θ .

结果表明,点积可以通过两个矢量的对应元素相乘并求和得到。所以,为了 上面,点积是 1 * 4 + 2 * 5 + 3 * 6 = 32 .

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

(1078 ** 0.5) * cos θ = 32
cos θ = 32 / (1078 ** 0.5)
θ = arccos(32 / (1078 ** 0.5))
θ ≈ 12.93 (in degrees)

现在,剩下的就是在代码中实现它:

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

将此函数应用于 从弧度到度数的转换(除以_,再乘以180)得到12.93。