我正在尝试使用Lua的Mathfu :: Vector来创建向量,但是当我尝试从堆栈中检索用户数据时遇到了问题。
这是我用来定义用户数据的功能
static int vec4(lua_State *L)
{
const float x = luaL_checknumber(L, 1);
const float y = luaL_checknumber(L, 2);
const float z = luaL_checknumber(L, 3);
const float w = luaL_checknumber(L, 4);
mathfu::Vector<float, 4> vec(x, y, z, w);
*static_cast<mathfu::Vector<float, 4> **>(
lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = &vec;
luaL_setmetatable(L, VECTOR_LIB_NAME);
return 1;
}
而且我有一个函数,它基于self
值和一个参数(均为userdata)获得两个向量的点积。>
static int dotVector(lua_State *L) { mathfu::Vector<float, 4> *vecA = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 1, VECTOR_LIB_NAME)); mathfu::Vector<float, 4> *vecB = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 2, VECTOR_LIB_NAME)); LOGI("A: %f, %f, %f", vecA->x, vecA->y, vecA->z); LOGI("B: %f, %f, %f", vecB->x, vecB->y, vecB->z); float dot = mathfu::Vector<float, 4>::DotProduct(*vecA, *vecB); lua_pushnumber(L, dot); return 1; };
来自lua的称呼
local vecA = vec4(1, 2, 3, 4) local vecB = vec4(5, 6, 7, 8) vecA:dot(vecB)
但是打印出来的值太疯狂了,就像将坏数据转换为浮点数一样>>
A: -8055257885499399810754615288266752.000000, 0.000000, 0.000000 B: 0.000000, 3746318080.000000, 3573.204346
我已经检查了堆栈,并且前两个元素肯定是UserData,但是我似乎无法更深入地研究用户数据。 C ++中的var包含这些值,但是我对可能导致这种情况的内容不知所措。可以肯定的是,用户数据不是我期望的那样。
我正在尝试使用Lua的Mathfu :: Vector创建向量,但是当我尝试从堆栈中检索用户数据时遇到了一个问题。这是我用来定义用户数据的静态函数...
最终发现这很愚蠢,用&
进行引用似乎是获取指向对象的指针的不正确方法。我将向量初始化代码更改为
static int vec4(lua_State *L)
{
const float x = luaL_checknumber(L, 1);
const float y = luaL_checknumber(L, 2);
const float z = luaL_checknumber(L, 3);
const float w = luaL_checknumber(L, 4);
*static_cast<mathfu::Vector<float, 4> **>(
lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = new mathfu::Vector<float, 4>(x, y, z, w);;
luaL_setmetatable(L, VECTOR_LIB_NAME);
return 1;
}