“LlAngleBetween”的版本间的差异
(创建页面,内容为“{{LSL Header|ml=*}}{{LSLC|Keywords}}{{LSLC|Flow Control}}{{LSLC|}} {{函数详情 |函数名=Function: float llAngleBetween( rotation a, rotation b ); |参数=…”) |
|||
| 第33行: | 第33行: | ||
== 参考 == | == 参考 == | ||
| + | |||
float AngleBetween(rotation a, rotation b)//simple but turns out to not be very accurate. | float AngleBetween(rotation a, rotation b)//simple but turns out to not be very accurate. | ||
| + | |||
{ | { | ||
return 2.0 * llAcos( llFabs(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) | return 2.0 * llAcos( llFabs(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) | ||
| 第40行: | 第42行: | ||
} | } | ||
float AngleBetween(rotation a, rotation b)//more complex implementation but more accurate, and reasonably fast. | float AngleBetween(rotation a, rotation b)//more complex implementation but more accurate, and reasonably fast. | ||
| + | |||
{ | { | ||
rotation r = b / a; // calculate the rotation between the two arguments as quaternion | rotation r = b / a; // calculate the rotation between the two arguments as quaternion | ||
2020年5月18日 (一) 08:49的最新版本
| 首页 | 函数 | 事件 | 类型 | 操作符 | 常数 | Flow Control | Script Library | Categorized Library | Tutorials |
| 函数名 |
|---|
| Function: float llAngleBetween( rotation a, rotation b ); |
| 参数:返回一个浮点数,它是旋转a和旋转b之间的弧度角。 |
| •旋转a–开始旋转
•旋转b–结束旋转 |
| 注意事项 |
|---|
| 重要问题~Search JIRA for related Bugs |
| 示例 |
|---|
default
{
touch_start(integer num_detected)
{
rotation currentRootRotation = llGetRootRotation();
float angle = llAngleBetween(ZERO_ROTATION, currentRootRotation);
// PUBLIC_CHANNEL has the integer value 0
llSay(PUBLIC_CHANNEL,
"llAngleBetween(ZERO_ROTATION, " + (string)currentRootRotation + ") = " + (string)angle);
}
}
|
| 相关函数 |
|---|
| •llRotBetween•llRot2Angle |
| 相关事件 |
|---|
| == 参考 ==
float AngleBetween(rotation a, rotation b)//simple but turns out to not be very accurate. { return 2.0 * llAcos( llFabs(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s)
/ llSqrt((a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s)
* (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s)));
} float AngleBetween(rotation a, rotation b)//more complex implementation but more accurate, and reasonably fast. { rotation r = b / a; // calculate the rotation between the two arguments as quaternion
float s2 = r.s * r.s; // square of the s-element
float v2 = r.x * r.x + r.y * r.y + r.z * r.z; // sum of the squares of the v-elements
if (s2 < v2) // compare the s-component to the v-component
return 2.0 * llAcos(llSqrt(s2 / (s2 + v2))); // use arccos if the v-component is dominant
if (v2) // make sure the v-component is non-zero
return 2.0 * llAsin(llSqrt(v2 / (s2 + v2))); // use arcsin if the s-component is dominant
return 0.0; // one or both arguments are scaled too small to be meaningful, or the values are the same, so return zero
}//Written by Moon Metty & Miranda Umino. Minor optimizations by Strife Onizuka |