计算点和 3D 面之间的角度
Calculate the angle between a point and a 3D facet
我有一个 3D 点 (x,y,z) 和一个由三个 (x,y,z) 点定义的小平面。我正在尝试计算小平面和点之间的角度。这样我就可以适当地为小平面着色,就好像光线在 3D 中穿过它一样 space。
希望这张图片能让我了解我正在努力解决的问题。这 3 个点是相对于小平面 space 中的点,并且相对于其朝向的方向具有不同的角度。我要找的就是这个角度。如果这些点是光点,黑点会提供最亮的光,蓝色的亮度约为 50%,绿色的会非常暗。
虽然我可以计算任意两点的大小、长度和点积,但我不知道如何计算面本身与点之间的角度。
我想知道如何计算点是否在面的上方或水平面,即:点相对于面的角度。
我目前的代码是:
-- 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
-- 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
我有一个 3D 点 (x,y,z) 和一个由三个 (x,y,z) 点定义的小平面。我正在尝试计算小平面和点之间的角度。这样我就可以适当地为小平面着色,就好像光线在 3D 中穿过它一样 space。
希望这张图片能让我了解我正在努力解决的问题。这 3 个点是相对于小平面 space 中的点,并且相对于其朝向的方向具有不同的角度。我要找的就是这个角度。如果这些点是光点,黑点会提供最亮的光,蓝色的亮度约为 50%,绿色的会非常暗。
虽然我可以计算任意两点的大小、长度和点积,但我不知道如何计算面本身与点之间的角度。
我想知道如何计算点是否在面的上方或水平面,即:点相对于面的角度。
我目前的代码是:
-- 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
-- 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