2016-07-08 9 views
0

3Dポイント(x、y、z)と3つの(x、y、z)ポイントで定義されるファセットを持っています。私はファセットとポイントの間の角度を計算しようとしています。これは、光が3D空間内を移動しているかのように、ファセットを適切にシェードすることができるようにするためです。ポイントと3Dファセットの間の角度を計算します

うまくいけば、このイメージは、私がうまくいきたいと思っているアイデアを与えてくれるでしょう。 3つのドットは、ファセットに対して空間内の点であり、その向きに関連して異なる角度を有する。私が見つけたいのはこの角度です。ドットが光の点であれば、黒のドットは最も明るい光を提供し、青は約50%の明るさになり、緑は非常に暗くなる。 enter image description here

私は任意の2点の大きさ、長さ、内積を計算することができますが、ファセット自体と点の間の角度を計算する方法は失われています。

私は、ポイントがファセット上であるかレベルであるか、つまりファセットに対するポイントの角度を計算する方法を知りたいと思います。

私がこれまで持っているコードは次のとおりです。

-- 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 
+0

はどのようにして顔に_point_の角度を定義していますか?あなたは方向ベクトルを意味しますか? –

+0

(X、y、z)値による。私はおそらく方向ベクトルを意味しますが、私は違いがわからない、私は恐れています。 –

+0

入力データが不十分です。明るさを測定しているファセット上の点を指定する必要があります。したがって、プログラム入力は、ファセットを指定する3つのポイント、ファセットの1つのポイント(角度の頂点)、および1つの外部ポイント(光源のロケーション)で構成する必要があります。 @willywonkadailyblah - おそらく、OPはファセットの法線と光源の方向との間の角度を計算したいと考えています。 –

答えて

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 
+0

私のコードにsubtract_vectors()関数を追加しました - これは間違いありませんか? –

+0

3dベクトルから2dを引くことができるようにするには: 'return {x = ax-bx、y = ay-by、z =(az or bz)and(az or 0) - (bz or 0)} ' –

+0

Aren'すべてのベクトルは3Dに関係していますか? –

関連する問題