计算点与3D小平面之间的角度

时间:2016-07-08 21:53:31

标签: vector lua 3d angle

我有一个3D点(x,y,z)和一个由三个(x,y,z)点定义的小平面。我试图计算刻面和点之间的角度。这样我就可以适当地遮挡小平面,就好像光线在3D空间中穿过它一样。

希望这张图片可以让我了解我想要解决的问题。 3个点是相对于小平面的空间点,并且相对于其面对方向具有不同的角度。我希望找到这个角度。如果点是光点,黑点将提供最亮的光,蓝色将是约50%的亮度,绿色将是非常暗的。 enter image description here

虽然我可以计算任意两点的大小,长度和点积,但我不知道如何计算小平面本身与该点之间的角度。

我想知道如何计算点是高于或高于刻面,即:点相对于刻面的角度。

我到目前为止的代码是:

-- Get length of 2D or 3D vector
local function vector2d3dLength( vector )
    return math.sqrt( vector.x*vector.x + vector.y*vector.y + (vector.z or 0)*(vector.z or 0) )
end

-- Normalise 2D or 3D vector
local function normalise2d3dVector( vector )
    local len = vector2d3dLength( vector )

    if (len == 0) then
        return vector
    end

    local normalised = { x=vector.x/len, y=vector.y/len }

    if (vector.z) then
        normalised.z = vector.z/len
    end

    return normalised
end

local function crossProduct3d( a, b )
    return { x=a.y*b.z − a.z*b.y, y=a.z*b.x − a.x*b.z, z=a.x*b.y − a.y*b.x }
end

local function dotProduct3d( a, b )
    return a.x*b.x + a.y*b.y + a.z*b.z
end

-- subtract vector b from vector a
local function subtract_vectors( a, b )
    local sub = { x=a.x-b.x, y=a.y-b.y }

    if (a.z ~= nil and b.z ~= nil) then
        sub.z = a.z-b.z
    end

    return sub
end

1 个答案:

答案 0 :(得分:1)

-- black/blue/green point
local lightsource = { x = 111, y = 112, z = 113 }    

-- 3 points on the facet, first point is the center
local facet = {{ x = 1, y = 2, z = 3 },  
               { x = 4, y = 5, z = 6 },
               { x = 7, y = 8, z = 9 }}

local facet_normal = normalise2d3dVector(crossProduct3d(
   subtract_vectors(facet[2], facet[1]),
   subtract_vectors(facet[3], facet[1])))

local direction_to_lightsource = 
   normalise2d3dVector(subtract_vectors(lightsource, facet[1]))

local cos_angle = dotProduct3d( direction_to_lightsource, facet_normal )
-- cos_angle may be negative, it depends on whether facet points are CW or CCW

local facet_brightness = cos_angle * max_brightness