载入中...
搜索中...
未找到
Simulation.h
浏览该文件的文档.
1#pragma once
2
3#include "common/Result.h"
5
6#include <cstddef>
7#include <cstdint>
8#include <vector>
9
10#include <glm/vec3.hpp>
11
12namespace eve::graphics::hair {
13
22 glm::vec3 gravity{0.f, -9.81f, 0.f};
24 float damping = 0.95f;
26 int iterations = 4;
31 float compliance = 0.f;
33 float maxDt = 1.f / 30.f;
34 glm::vec3 wind{0.f, 0.f, 0.f};
39 float collisionY = -1.0e6f;
40};
41
53public:
55 GuideSimulator() = default;
56
61 [[nodiscard]] Result<void> reset(const StrandsDatas &guides,
62 const GuideSimParams &params = {});
63
65 void clear();
66
68 void setParams(const GuideSimParams &params);
70 [[nodiscard]] const GuideSimParams &params() const { return params_; }
71
73 [[nodiscard]] bool isReady() const { return !curves_.empty(); }
75 [[nodiscard]] size_t particleCount() const { return pos_.size(); }
77 [[nodiscard]] size_t curveCount() const { return curves_.size(); }
78
83 [[nodiscard]] Result<void> setPinnedRoots(const float *rootPositionsXYZ, int rootCount);
84
88 [[nodiscard]] Result<void> step(float dt);
89
94 [[nodiscard]] Result<StrandsDatas> snapshot() const;
95
96private:
97 struct CurveSpan {
98 uint32_t pointOffset = 0;
99 uint32_t pointCount = 0;
100 float length = 0.f;
101 };
102
103 struct Segment {
104 uint32_t i0 = 0;
105 uint32_t i1 = 0;
106 float restLength = 0.f;
107 };
108
109 void solveDistances(float dt);
110 void resolveCollisions();
111
112 GuideSimParams params_{};
113 std::vector<StrandPoint> restPoints_;
114 std::vector<CurveSpan> curves_;
115 std::vector<Segment> segments_;
116 std::vector<glm::vec3> pos_;
117 std::vector<glm::vec3> prev_;
118 std::vector<uint8_t> pinned_; // 1 = immovable
119};
120
121} // namespace eve::graphics::hair
float length
Definition CaveMesh.cpp:94
#define EVENGINE_API_BACKENDS
Definition Export.h:108
uint32_t i1
Definition Grass.cpp:61
uint32_t i0
Definition Grass.cpp:61
Move-only, checked operation results for the common layer.
float step
Definition TreeMesh.cpp:314
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Lightweight Verlet + XPBD simulator for guide curves only.
Definition Simulation.h:52
GuideSimulator()=default
Guide simulator.
size_t curveCount() const
Curve count.
Definition Simulation.h:77
const GuideSimParams & params() const
Params.
Definition Simulation.h:70
size_t particleCount() const
Particle count.
Definition Simulation.h:75
bool isReady() const
True when ready.
Definition Simulation.h:73
CPU-authoritative strand buffer (UE FHairStrandsDatas analogue).
std::vector< ParamSpec > params
Procedural hair/fur card meshes + material/LOD helpers (no strand simulation).
Definition Graphics.h:58
Parameters for CPU guide-strand dynamics (UE groom sim lite analogue).
Definition Simulation.h:21
int iterations
XPBD solver iterations per substep (clamped to [1, 16]).
Definition Simulation.h:26
float collisionY
Infinite ground plane y = collisionY; particles below are pushed up. Set very low (default) to disabl...
Definition Simulation.h:39
float compliance
XPBD distance compliance (m/N); 0 ≈ hard constraint. Larger values allow more stretch.
Definition Simulation.h:31
float damping
Velocity retention per second (0 = freeze, 1 = no damping).
Definition Simulation.h:24
float maxDt
Clamp for a single step (seconds).
Definition Simulation.h:33