osgWidget.LuaEngine是OpenSceneGraph库中的一个模块,用于在osgWidget中执行Lua脚本。
使用LuaEngine需要先加载脚本文件。可以使用loadFile
方法从文件中加载脚本:
local luaEngine = osgWidget.LuaEngine()
luaEngine:loadFile("script.lua")
加载脚本后,就可以执行其中的脚本了。使用call
方法可以执行脚本中的函数:
luaEngine:call("myFunction", arg1, arg2)
在执行脚本前,需要将变量注入到Lua中。可以使用setGlobal
方法注入全局变量:
luaEngine:setGlobal("var", 123) -- 注入数字变量
luaEngine:setGlobal("var", "hello") -- 注入字符串变量
luaEngine:setGlobal("var", osg.Vec3(1, 2, 3)) -- 注入OpenSceneGraph对象
在Lua脚本中就可以直接使用这些变量了:
print(var) -- 输出 123 或 hello 或 Vec3(1, 2, 3)
LuaEngine也支持调用C++函数。在加载Lua脚本之前,可以使用addFunction
方法将C++函数添加到Lua中:
function myFunction(x, y)
return osg.Vec2(x + y, x - y)
end
local luaEngine = osgWidget.LuaEngine()
luaEngine:addFunction("myFunction", myFunction)
在Lua脚本中就可以调用C++函数了:
local result = myFunction(2, 3)
print(result) -- 输出 Vec2(5, -1)
下面是一个使用LuaEngine的完整示例:
-- script.lua
-- 定义函数
function myFunction(x, y)
return osg.Vec2(x + y, x - y)
end
-- 打印变量
print(var)
-- 调用函数
local result = myFunction(2, 3)
print(result)
// main.cpp
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgWidget/Util>
#include <osgWidget/LuaEngine>
int main(int argc, char** argv)
{
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osgt");
osg::ref_ptr<osgWidget::Window> window = new osgWidget::Window("LuaEngine Demo", 0, 0, 800, 600);
osg::ref_ptr<osgWidget::Label> label = new osgWidget::Label("Hello, lua!");
// 创建Lua引擎
osg::ref_ptr<osgWidget::LuaEngine> luaEngine = new osgWidget::LuaEngine();
// 注入变量
luaEngine->setGlobal("var", 123);
// 加载脚本并执行
luaEngine->loadFile("script.lua");
// 添加标签到窗口中
window->addChild(label);
// 显示模型和窗口
osgViewer::Viewer viewer;
viewer.setSceneData(osgWidget::createMagnify(model, 3.0f));
viewer.setSceneData(osgWidget::createDecoratedWindow(window));
return viewer.run();
}