我想为 Lua 制作某种 Vector3 库,它可以让您使用简单的语法进行简单的 3D 位置操作。我会提到我正在使用 Luaj 来运行用于 Java 操作的 Lua 代码。
这是我的开始代码:
Vector3 = {
new = function (x1, y1, z1)
return {x = x1, y = y1, z = z1}
end
}
Position1 = Vector3.new(1, 5, 8)
Position2 = Vector3.new(4, 7, 2)
这就是我希望能够发生的事情:
Subtraction = Position1 - Position2
print(Subtraction.x, Subtraction.y, Subtraction.z) -- prints "-3, -2, 6"
关于使 EXACT 代码正常工作有什么想法吗?
最佳答案
这就是元表和元方法的用途。你应该读一读in the documentation .
基本上,它们让您重新定义运算符(和其他一些东西)对您的值执行的操作。您现在需要的是定义 __sub
元方法,它定义了如何处理 -
运算符。我想将来您也会想要重新定义其他元方法。
首先,在您的 Vector3
“类”中定义一个减法函数,该函数采用两个向量:
function Vector3.subtract(u,v)
return Vector3.new(u.x - v.x, u.y - v.y, u.z - v.z)
end
然后创建让 Vector3
知道它应该给所有向量的元表:
Vector3.mt = {__sub = Vector3.subtract}
当你创建一个新的向量时:
new = function (x1, y1, z1)
local vec = {x = x1, y = y1, z = z1}
setmetatable(vec, Vector3.mt)
return vec
end
您还可以使元表 (mt
) 成为您的 new
函数中的局部变量 - 这将防止外部代码干扰元表(因为它只会可通过您的 new
函数访问)。但是,将它放在 Vector3
中可以让您检查 v - "string"
等用法:
function Vector3.subtract(u,v)
if getmetatable(u) ~= Vector3.mt or
getmetatable(v) ~= Vector3.mt then
error("Only vectors can be subtracted from vectors", 2)
end
return Vector3.new(u.x - v.x, u.y - v.y, u.z - v.z)
end
关于lua - (Lua) 对非数值进行数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453002/