Получение модели для крепления к камере в 3D - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить 3D-модель, которую я внедрил в код Monogame (Xna 4.0), чтобы он постоянно находился в правом нижнем углу экрана, это пистолет - базовая модель пистолета, в нем нет ничего фантастического - не даже есть текстуры! Но я не могу понять это, я пробовал некоторые математики, чтобы заставить его остаться там, но проблема в том, что смещение X и Z, которое я установил, жестко запрограммировано, поэтому, когда игрок поворачивает камеру, в то время как пистолет вращается перед новым LookAt, реальная модель не перемещается, поэтому она очень быстро исчезает из виду.

Это был долгий путь для довольно бессмысленной трехмерной игры для курса A-Level (я полагаю, эквивалент старшей школы) по информатике, который я делаю в Monogame Xna, чтобы набрать эти оценки сложности, но я должен На последнем отрезке мне нужно, чтобы моя модель fbx сидела так, как будто игрок держит ее в правом нижнем углу экрана. Прямо сейчас, если он расположен в центре экрана, это не так заметно, однако, если я увеличу свое смещение по оси X или Z, чтобы расположить его там, где я хочу, когда вы начнете поворачивать камеру, она отстанет от камеры или войдет внутрь. массивный круг вокруг камеры, который разбивает погружение (несмотря на то, как глупо это звучит, это действительно меня раздражает).

После того, как простой способ не сработал, я попытался прикрепить его к BoundingBox, который используется текущей камерой: все еще оставил пробел, попробовал BoundingSphere, чтобы посмотреть, смогу ли я заставить его перемещаться по краю сферы и следовать играть таким образом: не повезло. Еще.

tl; dr Я пытался прикрепить пистолет к BoundingBox, BoundingSphere и обычному векторному позиционированию, но безуспешно.

                    if (pausedGame == false)
                {
                    camera.UpdateCamera(gameTime);
                    if (carryingWeapon)
                    {
                        weapons[weaponToCarry].SetRotationMatrix(Matrix.CreateRotationX(camera.GetCameraRotation().X), Matrix.CreateRotationY(camera.GetCameraRotation().Y));
                        weapons[weaponToCarry].SetPosition(camera.weaponSlot.Center + camera.GetLookAtOffSet());
                        //Debug.WriteLine(weapons[weaponToCarry].Position);
                        //Debug.WriteLine(camera.Position);
                    }
                    CheckCollision();
                    AIMovement();
                    UpdateVisitedNodes(updatedNodes);
                }

это было мое обновление для него, простая установка положения и поворота модели. «Weaplot.Centre» происходит из-за того, что я прямо сейчас остановился на использовании BoundingSphere, так что часть кода все еще там.

            else if (_state == ItemState.Dynamic)
        {               
            foreach (var mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    effect.PreferPerPixelLighting = true;
                    effect.World = Matrix.CreateScale(SCALE, SCALE, SCALE) * rotationMatrix * 
                        Matrix.CreateTranslation(position);
                    effect.View = view;
                    effect.Projection = projection;
                }
                mesh.Draw();
            }
        }

это мой розыгрыш настоящего предмета, ничего особенного.

Как вы можете себе представить, я хочу, чтобы он был заблокирован в правом нижнем углу усеченного конуса и перемещал его положение в соответствии с тем, куда смотрит сам игрок. Прямо сейчас позиционирование предмета действительно испорчено - любая концептуальная помощь приветствуется! Спасибо.

1 Ответ

0 голосов
/ 28 января 2019

То, что я хотел бы сделать, это привязать пистолет к камере (это делается таким же образом в двигателях, таких как Unity).

Вы должны сделать это самостоятельно в моно (я думаю) - основной принцип - сначала преобразовать оружие относительно кулачка, а затем умножить на камеры World-Matrix - это также означает, что положение оружия относительно на камеру

gun.worldmatrix = Matrix.CreateTranslation(gun.position) * camera.world;

Теперь вы просто перемещаете и поворачиваете камеру, и пистолет удерживается в относительном положении относительно камеры. Помните: в этом случае положение орудия / (вращение) должно быть относительно камеры .

Важным является только порядок, в котором вы умножаете матрицы (не пробовал, надеюсь, я понял прямо выше)

...