c#如何从两个不同的相机位置两次绘制相同的3D模型?

时间:2017-01-23 18:17:19

标签: c# 3d camera xna xna-4.0

使用C#/ XNA 4.0 :(但问题是与代码无关的) 我试图制作一个" viewscreen / security camera"样式特征:即在主屏幕中首先渲染的3D模型,从(全局)固定的摄像机角度 - 以及在一个小的“窗口”类似的框中,比如在右上角,从固定的(相对于3D模型)摄像机点。

为了展示我的目标,这里有一个来自Pixar Cars" Tokyo Mater"简短,可能是非法上传,显示在背景中渲染的主要图像,以及(两个)较小的子窗口,从略微不同的角度显示相同的场景(https://www.youtube.com/watch?v=zdPt8-ypLmI#t=02m09s)为什么这是我的例子?可能是因为我3岁的孩子已经看过很多次了,它已经在我脑海里灼烧,但我们离题了......

第一部分工作正常,我让模特愉快地在空间中移动,并且他们在正确的位置正确地渲染。

这是看起来的样子:

foreach (ModelMesh mesh in theirModel.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();

                effect.World = transforms[mesh.ParentBone.Index] 
                    * Matrix.CreateScale(.03f)
                    * Matrix.CreateRotationY(theirmodelRotation)
                    * Matrix.CreateTranslation(theirmodelPosition); // "real" world model location happens to be (0,0,-100000)

                effect.View = Matrix.CreateLookAt(
                    cameraPosition, // main screen camera location, happens to be 0,3500,10000
                    Vector3.Zero,
                    Vector3.Up);

                effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f), 
                    .5f, 
                    nearClippingDistance,             
                   farClippingDistance);                           
            }
            // Draw the mesh, using the effects set above.
            mesh.Draw(); 
        }

但子窗口部分给我带来了困难。以下是我尝试的内容:(代码在绘制序列中的上述内容后立即运行)

 foreach (ModelMesh mesh in theirModel.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();

                effect.World = transforms[mesh.ParentBone.Index] 
                    * Matrix.CreateScale(.03f)
                    * Matrix.CreateRotationY(theirmodelRotation)
                    * Matrix.CreateTranslation(theirmodelPosition); // same as above

                    effect.View = Matrix.CreateLookAt(
                        //cameraPosition,                        
                        new Vector3(
          theirmodelPosition.X, 
          theirmodelPosition.Y, 
          theirmodelPosition.Z - 12000, // sub-window camera location, fixed in front of model
                        Vector3.Zero, 
                        Vector3.Up);                    

                effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f), 
                    .5f, 
                    nearClippingDistance,
                    farClippingDistance);

            }
            // Draw the mesh, using the effects set above.
            mesh.Draw(); 
 }

}

我尝试保持一切相同,并将第二次绘制的相机位置更改为仅相对于模型的位置进行修复,但这会导致第二次绘制位于屏幕的中心,而不是(例如)右上角 - 如果我将摄像机位置更改为右上角,则会扰乱它在对象上看到的角度。还存在其他问题,例如,如果模型的位置在(例如)Y轴和Z轴之间变化,则子窗口相机慢慢偏离对准,但我认为它们都来自同一个问题:只需改变相机与模型相关的位置然后重新绘制就不够了。

所以这是一般性问题,而不是试图调试我上面可能遇到的任何具体问题:给定标准世界,视图和投影矩阵,正确呈现正常的3D模型,这3个矩阵的哪些部分(我假设,或许是错误的,在视图中)需要改变以再次渲染该模型(和/或其附近的任何背景/其他模型,即在视野内)(X) ,Y)在屏幕上,从固定的摄像机角度(Z)到该模型的距离?

提前致谢,如果我没有问过这个问题我很抱歉。

0 个答案:

没有答案