我是OpenGl Devloper中的新成员,我想在OpenGl android中呈现3D模型,因此我选择了min3d框架库。如何平移放大缩小min3d中的功能Android
我想平移放大缩小功能,为我min3d
像模型,像照相机放大缩小,我有3dmodel小姐,我想缩小她的脸上没有规模的任何解决方案目的?
我是OpenGl Devloper中的新成员,我想在OpenGl android中呈现3D模型,因此我选择了min3d框架库。如何平移放大缩小min3d中的功能Android
我想平移放大缩小功能,为我min3d
像模型,像照相机放大缩小,我有3dmodel小姐,我想缩小她的脸上没有规模的任何解决方案目的?
您需要更改相机位置。我建议你定义一些额外的参数center
和distance
,因为你想平移。
当您有缩放手势时,只需将缩放比例应用到距离distance *= scale
(或distance = originalDistance*scale
,具体取决于实施)。
在平底锅上,您只需将center
移动距离center.x += (newXOnScreen-oldXOnScreen)*speedFactor
和center.y += (newYOnScreen-oldYOnScreen)*speedFactor
即可。速度因素在这里可能是恒定的(随着它的变化而变化),但最好也可以将它乘以缩放比例,如果它非常接近,则中心移动得更少。
既然你有这2个参数,你需要将它们应用到相机。假设你的模型位置为(0,0,0)
:
scene.camera.position = {center.x, center.y, center.z-distance}
scene.camera.target = {center.x, center.y, center.z}
scene.camera.up = {0, 1, 0}
你好,如何获得newYonscreen和newXonScreen?以及如何获得origanldistance。触摸事件 –
您通常会跟踪您获取手指位置的拖动事件(newXOnScreen,newYOnScreen),您将这些事件保存到(oldXOnScreen,oldYOnScreen),因此在下一个事件时,您可以减去2以获得向量多少手指实际上移动并将其应用于平移。原始距离是用户开始变焦前使用的距离。这是您在开始时选择应用的任何值,因此您可以在模型上获得最佳视图。 –
Number3d number3d = new Number3d(event.getX(0),event.getY(0),scene.camera()。position.z-0.5f); scene.camera()。position = number3d; scene.camera()。target = number3d; scene.camera()。upAxis.y = 1; :我正在写这个代码,我的模型不显示 –
以下代码片段适用于我。这不是完整的代码,但我刚刚添加了在min3d框架中执行三维对象的缩放和拖动的部分。我放在一起通过下面的在线教程中的代码here和修改根据应用
//import statements
public class threedviewActivity extends RendererActivity {
private Object3dContainer Object3D;
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f,mLastTouchX,mLastTouchY,mPosX,mPosY;
private int mActivePointerId = INVALID_POINTER_ID,flag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mScaleDetector = new ScaleGestureDetector(threedviewActivity.this, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
final int action = MotionEventCompat.getActionMasked(ev);
switch (action) {
case MotionEvent.ACTION_DOWN: {
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
updateScene();
break;
}
case MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position
final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
// Remember this touch position for the next move event
mLastTouchX = x;
mLastTouchY = y;
flag = 1;
updateScene();
break;
}
case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex);
mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex);
mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
}
break;
}
}
return true;
}
@Override
public void initScene()
{
//this is where you initialize your 3d object. Check below for links for tutorials on that.
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
Object3D.scale().x = Object3D.scale().y = Object3D.scale().z = mScaleFactor*1.5f;
flag = 0;
updateScene();
return true;
}
}
@Override
public void updateScene()
{
if(flag == 1)
{
Object3D.position().x = mPosX/100;
Object3D.position().y = -mPosY/100;
}
}
}
?通常你使用视图矩阵,你应用lookAt过程接受眼睛的位置,中心朝着你看向上的方向。通过一点数学运算,您可以轻松应用缩放,平移和旋转功能。 –
我想触摸事件,所以我使用触摸事件在这个我写这个代码GLU.gluLookAt(Shared.renderer()。gl(), scene.camera()。position.x,scene.camera()。 position.y,scene.camera()。position.z, scene.camera()。target.x + 1,scene.camera()。target.y + 1,scene.camera()。target.z + 1 , scene.camera()。upAxis.x,scene.camera()。upAxis.y,scene.camera()。upAxis.z);你可以给代码..? –