//This is used to start all controlled movements. It adds velocity in relation to the camera's direction. void Position::beginMove(Direction direction, float magnitude) { float azimuth = look->getAzimuth(); if (direction == Direction::FRONT) { addVelocity(new Point( sin(azimuth*DEG2RAD)*magnitude, 0.0, cos(azimuth*DEG2RAD)*magnitude)); } if (direction == Direction::BACK) { addVelocity(new Point( -sin(azimuth*DEG2RAD)*magnitude, 0.0, -cos(azimuth*DEG2RAD)*magnitude)); } if (direction == Direction::RIGHT) { addVelocity(new Point( sin((90 + azimuth)*DEG2RAD)*magnitude, 0.0, cos((90 + azimuth)*DEG2RAD)*magnitude)); } if (direction == Direction::LEFT) { addVelocity(new Point( -sin((90 + azimuth)*DEG2RAD)*magnitude, 0.0, -cos((90 + azimuth)*DEG2RAD)*magnitude)); } if (direction == Direction::UP) { velocity->addY(magnitude); } if (direction == Direction::DOWN) { velocity->addY(-magnitude); } }
bool idCameraPosition::parseToken(const char *key, const char *(*text)) { const char *token = Com_Parse(text); if (Q_stricmp(key, "time") == 0) { time = atol(token); return true; } else if (Q_stricmp(key, "type") == 0) { type = static_cast<idCameraPosition::positionType>(atoi(token)); return true; } else if (Q_stricmp(key, "velocity") == 0) { long t = atol(token); token = Com_Parse(text); long d = atol(token); token = Com_Parse(text); float s = atof(token); addVelocity(t, d, s); return true; } else if (Q_stricmp(key, "baseVelocity") == 0) { baseVelocity = atof(token); return true; } else if (Q_stricmp(key, "name") == 0) { name = token; return true; } else if (Q_stricmp(key, "time") == 0) { time = atoi(token); return true; } Com_UngetToken(); return false; }
/* ================ idCameraPosition::parseToken ================ */ bool idCameraPosition::parseToken( const idStr &key, idParser *src ) { idToken token; if ( !key.Icmp( "time" ) ) { time = src->ParseInt(); return true; } else if ( !key.Icmp( "type" ) ) { type = static_cast<idCameraPosition::positionType> ( src->ParseInt() ); return true; } else if ( !key.Icmp( "velocity" ) ) { long t = atol(token); long d = src->ParseInt(); float s = src->ParseFloat(); addVelocity(t, d, s); return true; } else if ( !key.Icmp( "baseVelocity" ) ) { baseVelocity = src->ParseFloat(); return true; } else if ( !key.Icmp( "name" ) ) { src->ReadToken( &token ); name = token; return true; } else { src->Error( "unknown camera position key: %s", key.c_str() ); return false; } }
void Entity::applyEntityCollision(Entity entity) { if(entity.riddenByEntity == this || entity.ridingEntity == this) { return; } double d = entity.posX - posX; double d1 = entity.posZ - posZ; double d2 = MathHelper.abs_max(d, d1); if(d2 >= 0.0099999997764825821) { d2 = MathHelper.sqrt_double(d2); d /= d2; d1 /= d2; double d3 = 1.0D / d2; if(d3 > 1.0D) { d3 = 1.0D; } d *= d3; d1 *= d3; d *= 0.05000000074505806; d1 *= 0.05000000074505806; d *= 1.0F - entityCollisionReduction; d1 *= 1.0F - entityCollisionReduction; addVelocity(-d, 0.0D, -d1); entity.addVelocity(d, 0.0D, d1); } }
void Particle::doVerlet() { if (!_isFixed) { if(_params->doGravity) { Vec3f gravityForce = _params->gravity; addVelocity(gravityForce); } Vec3f curPos = _pos; Vec3f vel = _pos - _oldPos; // _pos += vel * _params->drag * _drag + _params->timeStep2; _pos += (_pos - _oldPos);// + _params->timeStep2; // TODO _oldPos = curPos; } }
//-------------------------------------------------------------- void ftFluidSimulation::update(float _deltaTime){ float time = ofGetElapsedTimef(); if (_deltaTime != 0) deltaTime = _deltaTime; else deltaTime = time - lastTime; lastTime = time; timeStep = deltaTime * speed.get(); if (doReset) { doReset.set(false); reset(); } ofPushStyle(); ofEnableBlendMode(OF_BLENDMODE_DISABLED); // OBSTACLE BUFFER; if (combinedObstacleNeedsToBeCleaned) { combinedObstacleBuffer.clear(); combinedObstacleBuffer.scaleIntoMe(obstacleBuffer); combinedObstacleNeedsToBeCleaned = false; } if (addTempObstacleBufferDidChange) { ofEnableBlendMode(OF_BLENDMODE_ADD); combinedObstacleBuffer.scaleIntoMe(addTempObstacleBuffer); addTempObstacleBufferDidChange = false; addTempObstacleBuffer.clear(); combinedObstacleNeedsToBeCleaned = true; } ofEnableBlendMode(OF_BLENDMODE_DISABLED); // CLAMP LENGTH if (maxDensity.get() > 0.0) { clampLengthShader.update(*densitySwapBuffer.dst, densitySwapBuffer.src->getTextureReference(), maxDensity.get(), clampForce.get()); densitySwapBuffer.swap(); } if (maxVelocity.get() > 0.0) { clampLengthShader.update(*velocitySwapBuffer.dst, velocitySwapBuffer.src->getTextureReference(), maxVelocity.get(), clampForce.get()); velocitySwapBuffer.swap(); } if (maxTemperature.get() > 0.0) { clampLengthShader.update(*temperatureSwapBuffer.dst, temperatureSwapBuffer.src->getTextureReference(), maxTemperature.get(), clampForce.get()); temperatureSwapBuffer.swap(); } // VORTEX CONFINEMENT if (vorticity.get() > 0.0) { vorticityFirstPassShader.update(vorticityFirstPassBuffer, velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference()); vorticitySecondPassShader.update(vorticitySecondPassBuffer, vorticityFirstPassBuffer.getTextureReference(), timeStep, vorticity.get(), cellSize.get()); addVelocity(vorticitySecondPassBuffer.getTextureReference()); } // ADVECT advectShader.update(*velocitySwapBuffer.dst, velocitySwapBuffer.src->getTextureReference(), velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), timeStep, 1.0 - (dissipation.get() + velocityOffset.get()), cellSize.get()); velocitySwapBuffer.swap(); advectShader.update(*densitySwapBuffer.dst, densitySwapBuffer.src->getTextureReference(), velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), timeStep, 1.0 - (dissipation.get() + densityOffset.get()), cellSize.get()); densitySwapBuffer.swap(); // DIFFUSE if (viscosity.get() > 0.0) { for (int i = 0; i < numJacobiIterations.get(); i++) { diffuseShader.update(*velocitySwapBuffer.dst, velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), viscosity.get() * deltaTime); velocitySwapBuffer.swap(); } } // SMOKE BUOYANCY if (smokeSigma.get() > 0.0 && smokeWeight.get() > 0.0 ) { advectShader.update(*temperatureSwapBuffer.dst, temperatureSwapBuffer.src->getTextureReference(), velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), timeStep, 1.0 - (dissipation.get() + temperatureOffset.get()), cellSize.get()); temperatureSwapBuffer.swap(); smokeBuoyancyShader.update(smokeBuoyancyBuffer, velocitySwapBuffer.src->getTextureReference(), temperatureSwapBuffer.src->getTextureReference(), densitySwapBuffer.src->getTextureReference(), ambientTemperature.get(), timeStep, smokeSigma.get(), smokeWeight.get(), gravity.get()); addVelocity(smokeBuoyancyBuffer.getTextureReference()); } else temperatureSwapBuffer.clear(); // DIVERGENCE AND JACOBI divergenceBuffer.clear(); divergenceShader.update(divergenceBuffer, velocitySwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), cellSize.get()); pressureSwapBuffer.clear(); for (int i = 0; i < numJacobiIterations.get(); i++) { jacobiShader.update(*pressureSwapBuffer.dst, pressureSwapBuffer.src->getTextureReference(), divergenceBuffer.getTextureReference(), combinedObstacleBuffer.getTextureReference(), cellSize.get()); pressureSwapBuffer.swap(); } // Multiply density by pressure and or vorticity if(densityFromPressure != 0) { densityFloatMultiplierShader.update(*densitySwapBuffer.dst, densitySwapBuffer.src->getTextureReference(), pressureSwapBuffer.src->getTextureReference(), densityFromPressure.get()); densitySwapBuffer.swap(); } if(densityFromVorticity != 0) { densityVec2MultiplierShader.update(*densitySwapBuffer.dst, densitySwapBuffer.src->getTextureReference(), vorticitySecondPassBuffer.getTextureReference(), -densityFromVorticity.get()); densitySwapBuffer.swap(); } // Drain some fluid if(addPressureBufferDidChange == true) { addPressureBufferDidChange = false; addShader.update(*pressureSwapBuffer.dst, pressureSwapBuffer.src->getTextureReference(), addPressureBuffer.getTextureReference(), 1.0); pressureSwapBuffer.swap(); } substractGradientShader.update(*velocitySwapBuffer.dst, velocitySwapBuffer.src->getTextureReference(), pressureSwapBuffer.src->getTextureReference(), combinedObstacleBuffer.getTextureReference(), cellSize.get()); velocitySwapBuffer.swap(); ofPopStyle(); }
void GameObject::addVelocity(const Point& delta) { addVelocity(delta.x, delta.y); }
virtual void addVelocity(float x, float y){ addVelocity(sf::Vector2f(x, y)); }