60void QQuick3DParticleAttractor::setPositionVariation(
const QVector3D &positionVariation)
62 if (m_positionVariation == positionVariation)
65 m_positionVariation = positionVariation;
66 Q_EMIT positionVariationChanged();
264void QQuick3DParticleAttractor::affectParticle(
const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d,
float time)
269 auto rand = system()->rand();
270 float duration = m_duration < 0 ? sd.lifetime : (m_duration / 1000.0f);
271 float durationVariation = m_durationVariation == 0
273 : (m_durationVariation / 1000.0f) - 2.0f * rand->get(sd.index, QPRand::AttractorDurationV) * (m_durationVariation / 1000.0f);
274 duration = std::max(duration + durationVariation, MIN_DURATION);
275 float pEnd = std::min(1.0f, std::max(0.0f, time / duration));
279 if (m_hideAtEnd && pEnd >= 1.0f) {
284 float pStart = 1.0f - pEnd;
285 QVector3D pos = m_centerPos;
288 if (m_useCachedPositions)
289 pos += m_shapePositionList[sd.index % m_shapePositionList.size()];
291 pos += m_shape->getPosition(sd.index);
294 if (!m_positionVariation.isNull()) {
295 pos.setX(pos.x() + m_positionVariation.x() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVX) * m_positionVariation.x());
296 pos.setY(pos.y() + m_positionVariation.y() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVY) * m_positionVariation.y());
297 pos.setZ(pos.z() + m_positionVariation.z() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVZ) * m_positionVariation.z());
300 d->position = (pStart * d->position) + (pEnd * m_particleTransform.map(pos));
QT_BEGIN_NAMESPACE const float MIN_DURATION
\qmltype Attractor3D \inherits Affector3D \inqmlmodule QtQuick3D.Particles3D