Implement part deform

master
Jeremy HU 2022-10-15 20:15:32 +11:00
parent 73b3dc3941
commit 978c2bf744
2 changed files with 14 additions and 2 deletions

View File

@ -96,8 +96,16 @@ std::vector<Vector3> TubeMeshBuilder::buildCutFaceVertices(const Vector3 &origin
std::vector<Vector3> cutFaceVertices(m_buildParameters.cutFace.size());
Vector3 u = m_generatedBaseNormal.rotated(-forwardDirection, m_buildParameters.baseNormalRotation);
Vector3 v = Vector3::crossProduct(forwardDirection, u).normalized();
auto uFactor = u * radius;
auto vFactor = v * radius;
auto uFactor = u * radius * m_buildParameters.deformWidth;
auto vFactor = v * radius * m_buildParameters.deformThickness;
if (m_buildParameters.deformUnified) {
if (!Math::isEqual(m_buildParameters.deformWidth, 1.0)) {
uFactor *= m_maxNodeRadius / radius;
}
if (!Math::isEqual(m_buildParameters.deformThickness, 1.0)) {
vFactor *= m_maxNodeRadius / radius;
}
}
for (size_t i = 0; i < m_buildParameters.cutFace.size(); ++i) {
const auto &t = m_buildParameters.cutFace[i];
cutFaceVertices[i] = origin + (uFactor * t.x() + vFactor * t.y());
@ -114,6 +122,9 @@ void TubeMeshBuilder::build()
buildNodePositionAndDirections();
for (const auto &it: m_nodes)
m_maxNodeRadius = std::max(m_maxNodeRadius, it.radius);
m_generatedBaseNormal = m_isCircle ?
BaseNormal::calculateCircleBaseNormal(m_nodePositions) :
BaseNormal::calculateTubeBaseNormal(m_nodePositions);

View File

@ -57,6 +57,7 @@ private:
std::vector<std::vector<size_t>> m_generatedFaces;
Vector3 m_generatedBaseNormal;
bool m_isCircle = false;
double m_maxNodeRadius = 0.0;
void preprocessNodes();
void buildNodePositionAndDirections();
std::vector<Vector3> buildCutFaceVertices(const Vector3 &origin,