62void QQuick3DParticleAttractor::setPositionVariation(
const QVector3D &positionVariation)
64 if (m_positionVariation == positionVariation)
67 m_positionVariation = positionVariation;
68 Q_EMIT positionVariationChanged();
266void QQuick3DParticleAttractor::affectParticle(
const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d,
float time)
271 auto rand = system()->rand();
272 float duration = m_duration < 0 ? sd.lifetime : (m_duration / 1000.0f);
273 float durationVariation = m_durationVariation == 0
275 : (m_durationVariation / 1000.0f) - 2.0f * rand->get(sd.index, QPRand::AttractorDurationV) * (m_durationVariation / 1000.0f);
276 duration = std::max(duration + durationVariation, MIN_DURATION);
277 float pEnd = std::min(1.0f, std::max(0.0f, time / duration));
281 if (m_hideAtEnd && pEnd >= 1.0f) {
286 float pStart = 1.0f - pEnd;
287 QVector3D pos = m_centerPos;
290 if (m_useCachedPositions)
291 pos += m_shapePositionList[sd.index % m_shapePositionList.size()];
293 pos += m_shape->getPosition(sd.index);
296 if (!m_positionVariation.isNull()) {
297 pos.setX(pos.x() + m_positionVariation.x() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVX) * m_positionVariation.x());
298 pos.setY(pos.y() + m_positionVariation.y() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVY) * m_positionVariation.y());
299 pos.setZ(pos.z() + m_positionVariation.z() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVZ) * m_positionVariation.z());
302 d->position = (pStart * d->position) + (pEnd * m_particleTransform.map(pos));
QT_BEGIN_NAMESPACE const float MIN_DURATION
\qmltype Attractor3D \inherits Affector3D \inqmlmodule QtQuick3D.Particles3D