reckfellENGINE

Интерполяция 2D и 3D: текущая реализация

Полный пример 3D и проверенные правила локальной иерархии, визуального transform и частиц.

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

Что одинаково

В обеих размерностях есть глобальная настройка, режим Entity и необходимость сброса истории после скачка. Обычные свойства transform описывают состояние сущности, а рендер может рисовать промежуточную позу. Родитель тоже влияет на итоговую картинку, поэтому проверяйте всю движущуюся ветвь.

В текущей версии Reckfell 3D использует EntityTreeFTI: интерполирует локальные transform и собирает итоговую мировую иерархию. У Off-ребёнка собственный локальный transform не сглаживается, но движение интерполируемого родителя всё равно входит в итоговый мировой transform. Этот случай отдельно проверяется работающим рендером.

Запустить сравнение 3D

Включите physics/common/physics_interpolation, временно задайте 10 физических шагов/с и более частый рендер. Добавьте файл ниже в C#-проект, прикрепите к корню Entity3D отдельного уровня, соберите и запустите F6. Окно — 640×420 или больше; корень статичный, без масштаба. Код создаёт камеру и видимые меши, внешние материалы/освещение не нужны.

Синий и белый объекты движутся с одинаковой физической X-координатой; у синего On, у белого Off. Снимок фиксирует один кадр, плавность сравнивайте при запуске. После выхода за границу история сбрасывается, а не растягивает изображение через всю сцену.

Объекты 3D с режимами On и Off

InterpolationDemo3D.cs
C#
using System;
using Reckfell;

public partial class InterpolationDemo3D : Entity3D
{
    public MeshInstance3D Smooth { get; private set; } = null!;
    public MeshInstance3D Stepped { get; private set; } = null!;
    public Camera3D Camera { get; private set; } = null!;
    public float Speed { get; set; } = 1.5f;
    public int Warps { get; private set; }
    private float _x = -2;
    private float? _warp;
    public override void _Ready()
    {
        Smooth = Marker(new Vector3(_x,1,0),new Color(.25f,.45f,1),PhysicsInterpolationModeEnum.On);
        Stepped = Marker(new Vector3(_x,-1,0),Colors.White,PhysicsInterpolationModeEnum.Off);
        Camera = new Camera3D { Position = new Vector3(0,0,8), Projection = Camera3D.ProjectionType.Orthogonal, Size = 7, Current = true, PhysicsInterpolationMode = PhysicsInterpolationModeEnum.Off }; AddChild(Camera);
        AddChild(new Label { Text = "On", Position = new Vector2(24,56), Modulate = new Color(.6f,.6f,.6f) });
        AddChild(new Label { Text = "Off", Position = new Vector2(24,226), Modulate = new Color(.6f,.6f,.6f) });
        ResetPhysicsInterpolation();
    }
    private MeshInstance3D Marker(Vector3 position,Color color,PhysicsInterpolationModeEnum mode)
    {
        var marker = new MeshInstance3D { Position = position, PhysicsInterpolationMode = mode, Mesh = new BoxMesh { Size = Vector3.One*.4f }, MaterialOverride =
            new StandardMaterial3D { AlbedoColor = color, ShadingMode = BaseMaterial3D.ShadingModeEnum.Unshaded } };
        AddChild(marker); return marker;
    }
    public void RequestWarp(float x)
    {
        if (!float.IsFinite(x)) throw new ArgumentOutOfRangeException(nameof(x));
        _warp = x;
    }
    public override void _PhysicsProcess(double delta)
    {
        bool reset = _warp.HasValue;
        _x = _warp ?? (_x + Speed * (float)delta); _warp = null;
        if (_x > 3) { _x = -2; reset = true; }
        Smooth.Position = new Vector3(_x,1,0); Stepped.Position = new Vector3(_x,-1,0);
        if (reset) { ResetPhysicsInterpolation(); Warps++; }
    }
}

Читать положение для картинки

В 3D GetGlobalTransformInterpolated предоставляет визуальный мировой transform потребителю вроде камеры. В физическом callback и при глобально выключенной системе он не является способом получить отдельную будущую симуляцию. Не используйте его для вычисления авторитетных столкновений. В SDK у Entity2D нет такого одноимённого метода. Для экранных координат отдельно согласуйте Canvas, камеру и viewport.

TopLevel и смена родителя меняют пространственную иерархию; это не просто переключатели качества сглаживания. После перепривязки проверьте локальные/мировые координаты и историю. Невозможность отключить движение родителя одним Off не означает ошибку локального режима.

Частицы и другие системы

У GpuParticles2D/GpuParticles3D в C# есть собственные FixedFps, Interpolate и LocalCoords. Эти настройки относятся к симуляции/отрисовке частиц и не тождественны Entity.PhysicsInterpolationMode. Отдельно проверяйте движение эмиттера, след уже выпущенных частиц, рестарт и телепорт. Нельзя обещать одинаковый результат любых GPU/CPU-частиц только по включённой глобальной настройке.

Для камеры с обновлением на каждом кадре используйте отдельный пример слежения. Для MultiMesh нужны согласованные истории экземпляров; для скелетной анимации — её собственная временная настройка. Проверки этой статьи охватывают простые Entity/MeshInstance и иерархию, но не все комбинации частиц, скелетов и рендеров.

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

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

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

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