Интерполяция 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. Снимок фиксирует один кадр, плавность сравнивайте при запуске. После выхода за границу история сбрасывается, а не растягивает изображение через всю сцену.
InterpolationDemo3D.cs
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 и иерархию, но не все комбинации частиц, скелетов и рендеров.