0

Bullet Physics の世界でオブジェクトを選択しようとしていますが、選択できるのは床/地面だけです!!! Vuforia SDK を使用しており、ImageTargets デモ コードを変更しました。次のコードを使用して、タッチしたスクリーン ポイントを 3D 世界に投影しました。

void projectTouchPointsForBullet(QCAR::Vec2F point, QCAR::Vec3F &lineStart, QCAR::Vec3F &lineEnd, QCAR::Matrix44F &modelViewMatrix)
{

QCAR::Vec4F normalisedVector((2 * point.data[0] / screenWidth - 1),
        (2 * (screenHeight-point.data[1]) / screenHeight - 1),
        -1,
        1);
QCAR::Matrix44F modelViewProjection;
SampleUtils::multiplyMatrix(&projectionMatrix.data[0],  &modelViewMatrix.data[0] , &modelViewProjection.data[0]);
QCAR::Matrix44F inversedMatrix = SampleMath::Matrix44FInverse(modelViewProjection);

QCAR::Vec4F near_point = SampleMath::Vec4FTransform( normalisedVector,inversedMatrix);

near_point.data[3] = 1.0/near_point.data[3];
near_point = QCAR::Vec4F(near_point.data[0]*near_point.data[3], near_point.data[1]*near_point.data[3], near_point.data[2]*near_point.data[3], 1);

normalisedVector.data[2] = 1.0;//z coordinate now 1
QCAR::Vec4F far_point = SampleMath::Vec4FTransform( normalisedVector, inversedMatrix);

far_point.data[3] = 1.0/far_point.data[3];
far_point = QCAR::Vec4F(far_point.data[0]*far_point.data[3], far_point.data[1]*far_point.data[3], far_point.data[2]*far_point.data[3], 1);

lineStart = QCAR::Vec3F(near_point.data[0],near_point.data[1],near_point.data[2]);
lineEnd = QCAR::Vec3F(far_point.data[0],far_point.data[1],far_point.data[2]);
} 

私の物理学の世界で光線テストをしようとすると、地面にしか当たらないようです! レイ テスト コールのコードは次のとおりです。

   QCAR::Vec3F intersection, lineStart;
   projectTouchPointsForBullet(QCAR::Vec2F(touch1.tapX, touch1.tapY), lineStart, lineEnd,inverseProjMatrix, modelViewMatrix);
    btVector3 btRayFrom = btVector3(lineEnd.data[0], lineEnd.data[1], lineEnd.data[2]);
    btVector3 btRayTo = btVector3(lineStart.data[0], lineStart.data[1], lineStart.data[2]);

    btCollisionWorld::ClosestRayResultCallback rayCallback(btRayFrom,btRayTo);
    dynamicsWorld->rayTest(btRayFrom, btRayTo, rayCallback);
    if(rayCallback.hasHit())
    {
        char* pPhysicsData = reinterpret_cast<char*>(rayCallback.m_collisionObject->getUserPointer());//my bodies have char* messages attached to them to determine what has been touched
        btRigidBody* pBody = btRigidBody::upcast(rayCallback.m_collisionObject);
        if (pBody && pPhysicsData)
        {
            LOG("handleTouches:: notifyOnTouchEvent from physics world!!!");
            notifyOnTouchEvent(env, obj,0,0, pPhysicsData);
        }

    }

私は主にトップダウンを見ていることを知っているので、地面にぶつかるはずです。少なくとも私のタッチが世界に正しく投影されていることは知っていますが、地面にあるオブジェクトがあり、そうではないようですそれらに触れることができます!どんなポインタでも大歓迎です:)

4

1 に答える 1

0

オブジェクトに触れることができなかった理由を見つけました-オブジェクトを描画するときにオブジェクトを拡大しているので、タッチポイントを3Dワールドに投影する前に、ビューマトリックスを同じ値で拡大縮小する必要がありました(編集Iまた、btRayFromとbtRayToの入力座標が逆になり、修正されました):

//top of code
int kObjectScale = 100.0f
....
...
//inside touch handler method
SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale,&modelViewMatrix.data[0]);
    projectTouchPointsForBullet(QCAR::Vec2F(touch1.tapX, touch1.tapY), lineStart, lineEnd,inverseProjMatrix, modelViewMatrix);
    btVector3 btRayFrom = btVector3(lineStart.data[0], lineStart.data[1], lineStart.data[2]);
    btVector3 btRayTo = btVector3(lineEnd.data[0], lineEnd.data[1], lineEnd.data[2]);

私のタッチは今正しく投影されています:)

于 2012-08-23T15:58:02.943 に答える