0

誰かが私がここで間違っているところを見ることができますか?

ModelとPositionを持つCameraObjectクラス(カメラではなく、単に「カメラ」を表すボックスのモデル)があります。また、通常のLoadContent()、Draw()、およびUpdate()メソッドもあります。ただし、モデルの配列を描画すると、画面に1つのモデルしか表示されません(3つある場合もありますが、すべて同じ場所にある場合があります)。

CameraModelクラスのDraw()メソッドは次のようになります。

public void Draw(Matrix view, Matrix projection) 
    { 
        transforms = new Matrix[CameraModel.Bones.Count]; 
        CameraModel.CopyAbsoluteBoneTransformsTo(transforms); 

        // Draw the model 
        foreach(ModelMesh myMesh in CameraModel.Meshes) 
        { 
            foreach (BasicEffect myEffect in myMesh.Effects) 
            { 
                myEffect.World = transforms[myMesh.ParentBone.Index]; 
                myEffect.View = view; 
                myEffect.Projection = projection; 

                myEffect.EnableDefaultLighting(); 
                myEffect.SpecularColor = new Vector3(0.25f); 
                myEffect.SpecularPower = 16; 
            } 
            myMesh.Draw(); 
        } 
    } 

次に、Game1クラスで、CameraObjectオブジェクトの配列を作成します。

CameraObject[] cameraObject = new CameraObject[3]; 

これをInitialize()-したがって、新しいオブジェクトはそれぞれ、前のオブジェクトから+10になるはずです。

for (int i = 0; i < cameraObject.Length; i++) 
        { 
            cameraObject[i] = new CameraObject(); 
            cameraObject[i].Position = new Vector3(i * 10, i * 10, i * 10); 
        } 

そして最後にDraw()

Matrix view = camera.viewMatrix; 
Matrix projection = camera.projectionMatrix; 

for (int i = 0; i < cameraObject.Length; i++) 
{ 
    cameraObject[i].Draw(view, projection); 
} 

ビューとプロジェクションが私のCamera()クラスからのものである場合、次のようになります。

viewMatrix = Matrix.Identity; 
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), 16 / 9, .5f, 500f); 

しかし、画面に描画されたオブジェクトは1つしか表示されませんか?コードをステップスルーしましたが、すべてうまくいくようですが、3つのオブジェクトが表示されない理由がわかりません。

誰かが私が間違っているところを見つけることができますか?

これは、UpdateViewMatrixに対する私のCamera()クラスのコードです。

private void UpdateViewMatrix(Matrix chasedObjectsWorld)
    {
        switch (currentCameraMode)
        {
            case CameraMode.free:
                // To be able to rotate the camera and and not always have it looking at the same point
                // Normalize the cameraRotation’s vectors, as those are the vectors that the camera will rotate around
                cameraRotation.Forward.Normalize();
                cameraRotation.Up.Normalize();
                cameraRotation.Right.Normalize();

                // Multiply the cameraRotation by the Matrix.CreateFromAxisAngle() function, 
                // which rotates the matrix around any vector by a certain angle
                // Rotate the matrix around its own vectors so that it works properly no matter how it’s rotated already
                cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Right, pitch);
                cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Up, yaw);
                cameraRotation *= Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll);

                // After the matrix is rotated, the yaw, pitch, and roll values are set back to zero
                yaw = 0.0f;
                pitch = 0.0f;
                roll = 0.0f;

                // The target is changed to accommodate the rotation matrix
                // It is set at the camera’s position, and then cameraRotation’s forward vector is added to it
                // This ensures that the camera is always looking in the direction of the forward vector, no matter how it’s rotated
                target = Position + cameraRotation.Forward;

                break;

            case CameraMode.chase:
                // Normalize the rotation matrix’s forward vector because we’ll be using that vector to roll around
                cameraRotation.Forward.Normalize();
                chasedObjectsWorld.Right.Normalize();
                chasedObjectsWorld.Up.Normalize();

                cameraRotation = Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll);

                // Each frame, desiredTarget will be set to the position of whatever object we’re chasing
                // Then set the actual target equal to the desiredTarget, can then change the target’s X and Y coordinates at will
                desiredTarget = chasedObjectsWorld.Translation;
                target = desiredTarget;

                target += chasedObjectsWorld.Right * yaw;
                target += chasedObjectsWorld.Up * pitch;

                // Always want the camera positioned behind the object, 
                // desiredPosition needs to be transformed by the chased object’s world matrix
                desiredPosition = Vector3.Transform(offsetDistance, chasedObjectsWorld);

                // Smooth the camera’s movement and transition the target vector back to the desired target
                Position = Vector3.SmoothStep(Position, desiredPosition, .15f);

                yaw = MathHelper.SmoothStep(yaw, 0f, .1f);
                pitch = MathHelper.SmoothStep(pitch, 0f, .1f);
                roll = MathHelper.SmoothStep(roll, 0f, .1f);

                break;

            case CameraMode.orbit:
                // Normalizing the rotation matrix’s forward vector, and then cameraRotation is calculated
                cameraRotation.Forward.Normalize();

                //  Instead of yawing and pitching over cameraRotation’s vectors, we yaw and pitch over the world axes
                // By rotating over world axes instead of local axes, the orbiting effect is achieved
                cameraRotation = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw) * Matrix.CreateFromAxisAngle(cameraRotation.Forward, roll);

                desiredPosition = Vector3.Transform(offsetDistance, cameraRotation);
                desiredPosition += chasedObjectsWorld.Translation;
                Position = desiredPosition;

                target = chasedObjectsWorld.Translation;

                roll = MathHelper.SmoothStep(roll, 0f, .2f);

                break;
        }

        // Use this line of code to set up the View Matrix
        // Calculate the view matrix
        // The up vector is based on how the camera is rotated and not off the standard Vector3.Up
        // The view matrix needs an up vector to fully orient itself in 3D space, otherwise,
        // the camera would have no way of knowing whether or not it’s upside-down
        viewMatrix = Matrix.CreateLookAt(Position, target, cameraRotation.Up);
    }
4

2 に答える 2

1

あなたのコードであなたのcameraObject[n].Position(おそらく3つのモデル間の位置を一意に区別する唯一のもの)がeffect.Worldプロパティに影響を与えているのを見ていません。

effect.World = transforms[myMesh.ParentBone.Index];

通常、個々のモデルの位置は考慮されません。

次のようなものを試してください。

for (int i = 0; i < cameraObject.Length; i++) 
{ 
    cameraObject[i].Draw(view, projection, cameraObject[i].Position); 
} 


//later in the draw method
public void Draw(Matrix view, Matrix projection, Vector3 pos)
{
  // ...
  myEffect.World = transforms[myMesh.ParentBone.Index] * Matrix.CreateTranslation(pos);
  // ...
}
于 2012-04-12T19:04:36.220 に答える
0

CameraObject [1]と[2]はcamera[0]よりも大きい正のZ値に配置され、ビューマトリックスは原点に配置され、負のZ方向を向いています(ビューマトリックスは世界の逆に相当するものであることに注意してください)。マトリックス)。viewMatrixをMatrix.Identityに設定する代わりに、これに設定すると、次の3つすべてが表示される場合があります。

viewMatrix = Matrix.CreateLookAt(new Vector3(0,0,75), Vector3.Zero, Vector3.Up);
于 2012-04-12T01:47:13.040 に答える