ToLua学习笔记,创建自定义矩阵类

我突然想到,框架里并没有提供Matrix4x4这个重要的类,所以我参考Quaternion.lua写了一个Matrix4X4.lua

Matrix4X4类内有16个公有的字段,而unity中的Matrix4X4类既可以通过.mXX的方式访问属性,也可以通过索引器Matrix4X4[m][n]的方式来访问,但lua中并没有索引器,

但是,我们可以通过表嵌套实现二维数组,但是一旦设计成嵌套表,那16个属性势必会分散到4个子表中,这时候如果再想直接通过.mXX的方式访问是不行的。这个时候就需要元函数的帮助了,以下是全部代码:

local math	= math
local tan   = math.tan
local pow   = math.pow
local setmetatable = setmetatable
local getmetatable = getmetatable
local rawget = rawget
local rawset = rawset
local Vector3 = Vector3
local Vector4 = Vector4
local order=4 --阶数

Matrix4x4 ={}

Matrix4x4.__index = function(t, k)		
	local var=rawget(Matrix4x4,k)
	
	if var~=nil then
		return var
	end
	
	if k=="m00" then
		return t[1][1]
	elseif k== "m01" then
		return t[1][2]
	elseif k== "m02" then
		return t[1][3]
	elseif k== "m03" then
		return t[1][4]
	elseif k== "m10" then
		return t[2][1]
	elseif k== "m11" then
		return t[2][2]
	elseif k== "m12" then
		return t[2][3]
	elseif k== "m13" then
		return t[2][4]
	elseif k== "m20" then
		return t[3][1]
	elseif k== "m21" then
		return t[3][2]
	elseif k== "m22" then
		return t[3][3]
	elseif k== "m23" then
		return t[3][4]
	elseif k== "m30" then
		return t[4][1]
	elseif k== "m31" then
		return t[4][2]
	elseif k== "m32" then
		return t[4][3]
	elseif k== "m33" then
		return t[4][4]
	end
	
	return nil
end

Matrix4x4.__newindex = function(t, k, v)	
	if t[k]~=nil then
		t[k]=v
	end
end

function Matrix4x4.New(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33)	
	local m =
	{
		{m00 or 0,m01 or 0,m02 or 0,m03 or 0},	
		{m10 or 0,m11 or 0,m12 or 0,m13 or 0},
		{m20 or 0,m21 or 0,m22 or 0,m23 or 0},
		{m30 or 0,m31 or 0,m32 or 0,m33 or 0}
	}
	
	setmetatable(m, Matrix4x4)	
	return m
end

local _new=Matrix4x4.New

Matrix4x4.__call = function(t,m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33)
	return _new(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33)
end

-
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值