LlGetSunDirection/ja
Jump to navigation
Jump to search
| LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: vector llGetSunDirection( );サンプル
これはスクリプトの動作により日中あるいは夜間(SL時間での短いもの)かどうかを素早く決定するのに用いることができます。返されるベクトルのZ要素が正の域の場合、太陽は地平線より上にあります。 <lsl>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 ]);
}
}</lsl>
注意点
AVERAGE_SUN_TILT = -.25 * pi SEASONAL_SUN_TILT = .03 * pi SUN_NORMALIZED_OFFSET = .45
これはmSunOffsetがどのように計算されているかをあらわしています。 <cpp>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 /
関連項目
関数
| • | llGetTimeOfDay |
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。