reckfellENGINE

Интерполяция: камера, мышь и MultiMesh

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

На этой странице

Камера с покадровым слежением

Если объект двигается в физике, а камера в _Process читает обычный GlobalPosition, она может следовать ступенчатому состоянию вместо того, что уже сгладил рендер. Для ручного покадрового слежения камера ниже читает GetGlobalTransformInterpolated и сама использует Off, чтобы не добавлять второе автоматическое сглаживание.

Создайте отдельную Camera3D со скриптом InterpolatedFollowCamera. Разместите её вне движущейся ветви цели, назначьте Target и сделайте текущей. В готовом InterpolationDemo3D можно назначить Smooth, отключив Current у прежней камеры. Глобальная интерполяция включена. Offset задаётся в мировых осях; это простая камера со смещением, без обхода препятствий и пружины.

InterpolatedFollowCamera.cs
C#
using Reckfell;

public partial class InterpolatedFollowCamera : Camera3D
{
    [Export] public Entity3D? Target { get; set; }
    [Export] public Vector3 Offset { get; set; } = new(0,3,7);
    public override void _Ready() { PhysicsInterpolationMode = PhysicsInterpolationModeEnum.Off; }
    public override void _Process(double delta)
    {
        if (Target is null || !ReckfellObject.IsInstanceValid(Target) || !Target.IsInsideTree() || !Offset.IsFinite() || Offset.LengthSquared() < .0001f) return;
        Vector3 point = Target.GetGlobalTransformInterpolated().Origin;
        GlobalPosition = point + Offset;
        Vector3 direction = -Offset.Normalized();
        if (Mathf.Abs(direction.Dot(Vector3.Up)) < .999f) LookAt(point,Vector3.Up);
    }
}

Нулевая/неконечная Offset отклоняется. Почти вертикальное направление не передаётся в LookAt с параллельным Up; выберите корректное смещение для нужной ориентации. Удалённая/неназначенная цель оставляет прежнюю позицию камеры. Это не игровой экран ошибки: назначение цели остаётся обязанностью уровня.

Можно выбрать другой подход — двигать камеру в физике и использовать автоматическое сглаживание. Не складывайте два подхода без осознанной причины. При ручном _Process берите визуальное состояние для картинки, а физическое — для правил игры. Чтение визуального transform в текущей реализации не требует отдельной инициализации из _Ready.

Мышь и отдельные ветви

Сохраняйте yaw/pitch в обычных полях при вводе и применяйте визуальный поворот в выбранной фазе. Поворот камеры от мыши не обязательно нужно задерживать до физического шага, но он не должен незаметно перезаписывать авторитетный transform тела. Чувствительность, захват указателя, ограничение pitch и развязка тела/камеры требуют отдельного контроллера; этот пример не изображает готовую first-person камеру.

Off отключает интерполяцию локального transform, а не математическое влияние движущегося родителя. Поэтому отдельная ветвь камеры надёжнее случайных переключений у ребёнка. GetGlobalTransformInterpolated предназначен для чтения в кадре; внутри физической фазы возвращаемое состояние не является промежуточной картинкой. При глобальном выключении метод проходит к обычному transform, что позволяет проверить проект без смены кода.

MultiMesh

Индекс экземпляра связывает предыдущую и текущую позы. Сохраняйте стабильное соответствие индексов объектам. При создании, телепорте или повторном использовании индекса задайте новый transform, затем ResetInstancePhysicsInterpolation для этого индекса. Сброс Entity-родителя не заменяет осознанное управление всей историей экземпляров.

Для массовой передачи SetBufferInterpolated принимает текущий и предыдущий буферы. Формат и длина должны соответствовать TransformFormat, InstanceCount, цветам и custom data; произвольный массив матриц не является подходящим буфером. Применяйте данные в согласованном шаге. PhysicsInterpolationQuality выбирает качество/стоимость доступного пути, а не исправляет перепутанные ID, layout или предыдущие состояния. Подробности методов — в MultiMesh API.

Профилируйте невидимые ветви, число экземпляров, обновления буферов и камеры. Запрос визуального transform не обязательно одинаково дешёв для всех видимых/скрытых иерархий. Автотест проверяет показанную камеру, локальную 3D-иерархию и сброс простых объектов; он не сертифицирует все варианты MultiMesh, particles, XR, mouse look или камеры с коллизиями.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.