OSG+Python

测试平台
(1)Fedora19 x86
  
[cc@localhost ~]$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GT 645M] (rev a1)

 


(2)Python 2.7
(3)Osg 3.2.0
(4)cmake 2.8
(5)gcc 4.8.2
#include <Python.h> #include <iostream> #include <string> #include <osgViewer/Viewer> #include <osgDB/ReadFile>

 


PyObject * pModule;
double CallPythonTest()
{
        PyObject * pFunc=PyObject_GetAttrString(pModule, "test");
        PyObject * value = PyObject_CallFunction(pFunc,"ff", -15.0f, -20.0f);    //通过函数对象执行函数
        double a = PyFloat_AsDouble(value);
        std::cout << a << std::endl;
        return a;
}

class MyEventHandler : public osgGA::GUIEventHandler
{
public:
    MyEventHandler()
    {
    }

    virtual bool handle(const osgGA::GUIEventAdapter & ea, osgGA::GUIActionAdapter & aa)
    {
        osgViewer::Viewer * viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
        osg::Camera * camera = viewer->getCamera();
        switch (ea.getEventType())
        {
            case osgGA::GUIEventAdapter::FRAME:
            {
            double a = CallPythonTest();
            camera->setViewMatrixAsLookAt(osg::Vec3(0.0, a, 0), osg::Vec3(0.0, 0.0, 0.0), osg::Vec3(0.0, 0.0, 1.0));
                break;
            }
        default:
            break;
        }

        return false;
    }
};

int main() {
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("import random");
    PyRun_SimpleString("sys.path.append('../PythonTest/')");
    pModule = PyImport_ImportModule("Test");
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    viewer->getCamera()->setViewMatrixAsLookAt(osg::Vec3(0.0, -20.0, 0.0), osg::Vec3(0.0, 0.0, 0.0), osg::Vec3(0.0,0.0, 1.0));
    viewer->setSceneData(osgDB::readNodeFile("cow.osg"));
    viewer->addEventHandler(new MyEventHandler);
    viewer->setUpViewInWindow(0, 0, 800, 600);
    while (!viewer->done())
    {
        viewer->frame();
    }
    Py_Finalize();
    return 0;
}


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
def test(a,b):
       return random.uniform(a, b)

 


project(PythonTest)
cmake_minimum_required(VERSION 2.8)
set(PythonSRC Person.py)
set(CMAKE_BUILD_TYPE Debug)
aux_source_directory(. SRC_LIST)
find_package(PythonLibs REQUIRED)
find_package(OpenSceneGraph 3.2.0 REQUIRED osg osgDB osgViewer osgGA)
include_directories(${PYTHON_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} ${SRC_LIST} ${PythonSRC})
target_link_libraries(${PROJECT_NAME} ${PYTHON_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES})

 

 

 测试结果:

  只是验证下效果,把改变位置的调用放在了每帧中,帧速太快。导致如图所示。

posted @ 2013-11-12 00:16  20118281131  阅读(3234)  评论(0编辑  收藏  举报