void CC3Matrix::populateToLookAt( const CC3Vector& targetLocation, const CC3Vector& eyeLocation, const CC3Vector& upDirection ) { CC3Vector fwdDir = targetLocation.difference( eyeLocation ); populateToPointTowards( fwdDir, upDirection ); transpose(); translateBy( eyeLocation.negate() ); m_isIdentity = false; m_isRigid = true; }
/** * Returns a 4D directional vector which can be added to each vertex when creating * the shadow volume vertices from the corresponding shadow caster vertices. * * The returned vector is in the local coordinate system of the shadow caster. * * The returned directional vector is a small offset vector in the direction away * from the light. A unit vector in that direction is scaled by both the distance * from the center of the shadow casting node to the camera and the * shadowVolumeVertexOffsetFactor property. Hence, if the shadow caster is farther * away from the camera, the returned value will be larger, to reduce the chance * of Z-fighting between the faces of the shadow volume and the shadow caster. */ CC3Vector4 CC3ShadowVolumeMeshNode::getShadowVolumeVertexOffsetForLightAt( const CC3Vector4& localLightPos ) { CC3Vector scLoc = getShadowCaster()->getLocalContentCenterOfGeometry(); CC3Vector lgtLoc = localLightPos.cc3Vector(); CC3Vector camLoc = getShadowCaster()->getGlobalTransformMatrixInverted()->transformLocation( getActiveCamera()->getGlobalLocation() ); // Get a unit offset vector in the direction away from the light CC3Vector offsetDir = (_light->isDirectionalOnly() ? lgtLoc.negate() : scLoc.difference( lgtLoc )).normalize(); // Get the distance from the shadow caster CoG and the camera, and scale the // unit offset vector by that distance and the shadowVolumeVertexOffsetFactor GLfloat camDist = scLoc.distance( camLoc ); CC3Vector offset = offsetDir.scaleUniform( camDist * _shadowVolumeVertexOffsetFactor ); CC3_TRACE("CC3ShadowVolumeMeshNode nudging vertices by %s", offset.stringfy().c_str()); // Create and return a 4D directional vector from the offset return CC3Vector4().fromDirection(offset); }
void CC3PointParticle::pointNormalAt( const CC3Vector& camLoc ) { setNormal( camLoc.difference( getLocation() ).normalize() ); }