2

簡単な構文で簡単な 3D 位置操作を行うことができる、ある種の Lua 用の Vector3 ライブラリを作成したいと考えています。Java操作用のLuaコードを実行するためにLuajを使用していることに言及します。

これが私の最初のコードです:

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コードを機能させるためのアイデアはありますか?

4

2 に答える 2

3

次のようなことができます。

Vector3 = {}

mt = {}

function Vector3:new(_x, _y, _z)
  return setmetatable({
    x = _x or 0, 
    y = _y or 0,
    z = _z or 0
  }, mt)
end

mt.__sub = function(v1, v2) return Vector3:new(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z) end
mt.__tostring = function(v) return "Vector3=(" .. v.x .. "," .. v.y .. "," .. v.z .. ")" end
mt.__index = Vector3 -- redirect queries to the Vector3 table

-- test Vector3
Position1 = Vector3:new(1, 5, 8)
Position2 = Vector3:new(4, 7, 2)
Sub = Position1 - Position2
print(Sub)

これは次のように出力されます:

Vector3=(-3,-2,6)

Lua & OO の詳細については、http: //lua-users.org/wiki/ObjectOrientationTutorialを参照してください。

于 2013-03-16T18:50:34.153 に答える
3

これが、メタテーブルとメタメソッドの目的です。ドキュメントを読む必要があります。

基本的に、値に対して演算子 (およびその他のいくつか) が行うことを再定義できます。今必要なのは、演算子__subの処理方法を定義するメタメソッドを定義することです。-将来的には、他のメタメソッドも再定義する必要があると思います。

Vector3まず、 「クラス」で 2 つのベクトルを取る減算関数を定義します。

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
于 2013-03-16T18:50:42.517 に答える