-------------------------------------------------------------------------------- -- State............ : Follow -- Author........... : -- Description...... : -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- function CarDemoCamera.Follow_onLoop ( ) -------------------------------------------------------------------------------- local target = this.hTarget ( ) if ( target ~= nil ) then local dt = application.getLastFrameTime ( ) local o = this.getObject ( ) local tx, ty, tz = object.getTranslation ( target, object.kGlobalSpace ) local vx, vy, vz local dist = 7 local focale = 23 local speed = dynamics.getLinearSpeed ( target ) local minspeed = 5 if ( this.bMoveBack ( ) ) then vx, vy, vz = object.getDirection ( target, object.kGlobalSpace ) else vx, vy, vz = object.getTranslation ( o, object.kGlobalSpace ) vx, vy, vz = math.vectorSubtract ( tx, ty, tz, vx, ty, vz ) vx, vy, vz = math.vectorNormalize ( vx, vy, vz ) end if ( speed > minspeed ) then local factor = math.min ( 35 - minspeed, speed - minspeed ) / ( 35 - minspeed ) dist = dist - 0.5 * dist * factor focale = focale + 40 * factor end dist = dist + vy * 5 focale = focale + vy * 5 dist = math.interpolate ( this.nCurDist ( ), dist, 2 * dt ) focale = math.interpolate ( this.nCurFocale ( ), focale, 2 * dt ) this.nCurDist ( dist ) this.nCurFocale ( focale ) local lookUp = vy > 0.95 vx, vy, vz = math.vectorNormalize ( vx, 0, vz ) vx, vy, vz = math.vectorScale ( vx, vy, vz, -dist ) vx, vy, vz = math.vectorAdd ( vx, vy, vz, tx, ty + 3 * ( 30 - math.min ( 30, speed ) ) / 30, tz ) -- LINEAR CONTROLLER ---[[ local ox, oy, oz = object.getTranslation ( o, object.kGlobalSpace ) vx, vy, vz = math.vectorSubtract ( vx, vy, vz, ox, oy, oz ) local lmax = math.vectorLength ( vx, vy, vz ) vx, vy, vz = math.vectorNormalize ( vx, vy, vz ) local scl = math.clamp ( speed, 0.25, 12 ) vx, vy, vz = math.vectorScale ( vx, vy, vz, scl * 1.4 * dt ) local l = math.min ( math.vectorLength ( vx, vy, vz ), lmax ) vx, vy, vz = math.vectorNormalize ( vx, vy, vz ) vx, vy, vz = math.vectorScale ( vx, vy, vz, l ) object.translate ( o, vx, vy, vz, object.kGlobalSpace ) object.lookAt ( o, tx, ty + 0.5, tz, object.kGlobalSpace, 1 ) camera.setFieldOfView ( o, focale ) -- Motion blur -- minspeed = 13 local maxspeed = 30 local factor = 0.1 * math.clamp ( speed - minspeed, 0, maxspeed - minspeed ) / ( maxspeed - minspeed ) factor = math.clamp ( factor / dt, 0, 0.8 ) camera.setMotionBlurFactor ( o, factor ) end -------------------------------------------------------------------------------- end --------------------------------------------------------------------------------