- 分析世界坐标,找出世界坐标的X軸的Y軸及其正負方向;
- 擷取世界坐标系下的機關長度大小,以供後續繪制三角形使用;
- 利用世界坐标系下的機關長度大小,定義三角形的三個頂點,若需要将斜邊放置在軸上,則采用勾股定理求出斜邊長度并對其頂點坐标進行設定即可;
- 使用相關API繪制三個頂點所定義的三角形;
- 添加三角形三個頂點在三角形自身局部坐标系下的縮放系數,并将其定義為公共參數;
- 添加三角形三個頂點在三角形自身局部坐标系下的偏移系數,并将其定義為公共參數;(也可根據世界坐标系下三角形生成的位置對其加以移動,縮放亦然);
- 使用偏移參數将生成的三角形放置在父物體的特定部位,比如:邊緣處;
- 針對局部坐标系下三角形的自轉,可直接設定其旋轉角度;
- 然而,為使三角形能夠跟着其父物體一同旋轉的同時還繞着父物體公轉,每次旋轉時對三角形的位置進行重新設定,使用如下數學公式修正三角形的位置[
]:theta為旋轉角度,注意使用弧度制
RelativeLocation.x = (originalPosX - parentPosX) * math.cos(math.rad(theta)) - (originalPosY - parentPosY) * math.sin(math.rad(theta)) + parentPosX
RelativeLocation.y = (originalPosX - parentPosX) * math.sin(math.rad(theta)) + (originalPosY - parentPosY) * math.cos(math.rad(theta)) + parentPosY
--RelativeLocation.z = SOME_VALUE
- 生成多個三角形,可以選擇直接在一邊生成的方式,此時可以建構等差數列
,其中,a1為初始的偏移參數,d為每個三角形之間的間距,an将作為累加的偏移項作用于每個生成的三角形上:an=a1+(n-1)*d
local sizeFactor = 1 --縮放倍率
local p1 = {x = -sizeFactor*(math.sqrt(2))*ONE, y = 0, z = 0}
local p2 = {x = 0, y = 0, z = 0}
local p3 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE, y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0}
local a1, d = 0, (math.sqrt(2)*ONE+interval) --建構等差數列: an = a1 + (n-1)*d
for i = 1, count do
local an = (i-1)*d
local A = {x = p1.x - an, y = p1.y, z = 0}
local B = {x = p2.x - an, y = p2.y, z = 0}
local C = {x = p3.x - an, y = p3.y, z = 0}
DrawTriangle(A, B, C)
end
- 生成多個三角形也可以選擇在兩邊生成的方式:
local sizeFactor = 1 --縮放倍率
local p1 = {x = -sizeFactor*(math.sqrt(2)/2)*ONE, y = 0, z = 0}
local p2 = {x = sizeFactor*(math.sqrt(2)/2)*ONE, y = 0, z = 0}
local p3 = {x = 0, y = sizeFactor*(math.sqrt(2)/2)*ONE, z = 0}
local a1, d = 0, (math.sqrt(2)*ONE+interval) --建構等差數列: an = a1 + (n-1)*d
local CreateTriangleOnSide = function(side)
for i = 1, math.floor(count/2) do
local an = i*d*side
local A = {x = p1.x - an, y = p1.y, z = 0}
local B = {x = p2.x - an, y = p2.y, z = 0}
local C = {x = p3.x - an, y = p3.y, z = 0}
DrawTriangle(A, B, C)
end
end
--中間生成一個,然後兩邊分别生成--
local SIDE = {LEFT = -1, RIGHT = 1} --生成左右兩邊專用枚舉
DrawTriangle(p1, p2, p3)
CreateTriangleOnSide(SIDE.LEFT)
CreateTriangleOnSide(SIDE.RIGHT)