通过触摸使用min3d android获取3d对象名称

时间:2015-12-09 03:50:52

标签: android opengl-es .obj ray-picking min3d

我需要添加我的android项目的功能,以获取3d对象的每个名称。物体是不规则的,可以根据用户的手势旋转。我有很多关于openGL光线拾取的阅读,但仍然无法弄清楚如何使其工作。我使用3d min来加载.obj文件。谢谢你提前。

1 个答案:

答案 0 :(得分:0)

min3d的创建者已弃用该库,并且有一个名为Rajawali的更新版本,它基于您可以找到here的相同原则。

如果不相同,设置场景/项目将非常相似。也有更好的表现。

对于触摸对象后获取3d对象名称,请执行以下操作:

在您的主要活动中;

    public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        mRenderer.getObjectAt(event.getX(), event.getY());
    }
    return super.onTouchEvent(event);
}

在渲染器中,您必须在initScene中注册“可选”对象;

    public class Renderer extends RajawaliRenderer implements OnObjectPickedListener {
private PointLight mLight;
private BaseObject3D object1, object2;
private ObjectColorPicker mPicker;

public RajawaliObjectPickingRenderer(Context context) {
    super(context);
    setFrameRate(60);
}

protected void initScene() {
    mPicker = new ObjectColorPicker(this);
    mPicker.setOnObjectPickedListener(this);
    mLight = new PointLight();
    mLight.setPosition(-2, 1, 4);
    mLight.setPower(1.5f);
    mCamera.setPosition(0, 0, 7);

        object1 = new BaseObject3D(serializedMonkey);
        object1.addLight(mLight);
        object1.setScale(.7f);
        object1.setPosition(-1, 1, 0);
        object1.setRotY(0);
        addChild(object1);

        object2 = object1.clone();
        object2.addLight(mLight);
        object2.setScale(.7f);
        object2.setPosition(1, 1, 0);
        object2.setRotY(45);
        addChild(object2);


        mPicker.registerObject(mMonkey3);
        mPicker.registerObject(mMonkey4);

}



public void getObjectAt(float x, float y) {
    mPicker.getObjectAt(x, y);
}

public void onObjectPicked(BaseObject3D object) {
    //Do whatever you want here once the object is touched
    if object.picked == mObject1{
        //print line here or toast
        //just an example, not legit code
    }
}
    }

如果您有任何问题,请随时提出。自从min3d创建以来,我一直在使用Rajawali。 ;)