LlGetSunDirection/ja
From Second Life Wiki
関数: vector llGetSunDirection( );
例
これはスクリプトの動作により日中あるいは夜間(SL時間での短いもの)かどうかを素早く決定するのに用いることができます。返されるベクトルのZ要素が正の域の場合、太陽は地平線より上にあります。
integer lightsOn = -1;//not TRUE or FALSE CheckSun() { vector sun = llGetSunDirection(); integer turnLightsOn = (sun.z < 0); if(turnLightsOn != lightsOn) { lightsOn = turnLightsOn; llSetPrimitiveParams([ PRIM_FULLBRIGHT, ALL_SIDES, lightsOn ]); } }
ノート
AVERAGE_SUN_TILT = -.25 * pi SEASONAL_SUN_TILT = .03 * pi SUN_NORMALIZED_OFFSET = .45
これはmSunOffsetがどのように計算されているかをあらわしています。
F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); F32 sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); sun_hour -= 6.0f; mSunOffset = HOURS_TO_RADIANS * sun_hour - (0.25f * F_PI) * cosf(HOURS_TO_RADIANS * sun_hour) - sun_phase; //And here's how sun direction is calculated: void LLRegion::calculateSunInfo( U64 current_time, LLVector3& directionp, LLVector3& ang_velocityp, F32& sun_phase) { U64 local_time = current_time; if(getSunFixed()) { local_time = 0; } // Sun moves (once a day) about a circle that lies on a tilted plane. // The angle of the plane cycles (once a year) a few radians about // some average. // These are F64's, otherwise we get rounding errors over time F64 daily_phase = DAILY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC) + mSunOffset; F64 yearly_phase = YEARLY_OMEGA * U64_to_F64(local_time / USEC_PER_SEC); F32 tilt = AVERAGE_SUN_TILT + SEASONAL_SUN_TILT_AMPLITUDE * (F32)sin(yearly_phase); sun_phase = (F32)fmod(daily_phase, 2.0*F_PI); // move sun around a circle directionp.setVec((F32)cos(-daily_phase), (F32)sin(-daily_phase), 0.0f); //tilt the circle about X-axis (due east) directionp.rotVec(tilt, 1.0f, 0.0f, 0.0f); // calculate angular velocity (radians per second) ang_velocityp.setVec(0.0f, 0.0f, (F32)DAILY_OMEGA); ang_velocityp.rotVec((F32)tilt, 1.0f, 0.0f, 0.0f); // James wanted the night to be shorter than the day. // We can do this by offsetting the center of the sun's orbit in the positive // z-direction and normalizing the new vector. directionp.mV[VZ] += SUN_NORMALIZED_OFFSET; F32 R = directionp.normVec(); // We also need to correct the angular velocity // // V = W % R // V has constant magnitude // As R goes up, W must go down // W and R are always perpendicular // ===> // W *= 1 / |R| ang_velocityp *= 1.0f / R; }
ソース:Zyzzy Zarf

