Math 旋转对象以指向目标2D

Math 旋转对象以指向目标2D,math,rotation,2d,angle,linden-scripting-language,Math,Rotation,2d,Angle,Linden Scripting Language,我试着做一个半圆,有一条直线从它的端点到目标点。我已经尝试了一天的多种方法,但无法让它精确地指向目标位置。以下是我目前的进展: 我想让深绿色的线穿过黄线上的红点 目前发布代码: vector init = <105.45535, 105.83867, 2239.99976>; vector init_unit = <-0.54465, 0.83867, 0.00000>; vector target = <106,104,2241>; default{

我试着做一个半圆,有一条直线从它的端点到目标点。我已经尝试了一天的多种方法,但无法让它精确地指向目标位置。以下是我目前的进展:

我想让深绿色的线穿过黄线上的红点

目前发布代码:

vector init = <105.45535, 105.83867, 2239.99976>;
vector init_unit = <-0.54465, 0.83867, 0.00000>;
vector target = <106,104,2241>;

default{

    state_entry(){
        llListen(-215485231, "", NULL_KEY, "");
    }

    listen(integer c, string n, key i, string m){
        list temp = llParseString2List(m, ["|"], []);
        init = (vector)llList2String(temp, 0); //position
        init_unit = (vector)llList2String(temp, 1);
        init_unit = llVecNorm(<init_unit.x, init_unit.y, 0.0>); //line norm vector


        float angle = llAtan2(init_unit.y, init_unit.x); //find angle
        rotation delta = llEuler2Rot(<0.0, -PI_BY_TWO, PI>); //extra rotation
        rotation rot = delta * llEuler2Rot(<0.0, 0.0, angle>); //convert from vector to rotation
        init = init + <0.0, -0.45, 0.0>*rot; //make new offset

        vector p1 = target - init;
        float angle2 = llAtan2(p1.y, p1.x);
        rotation rot2 = llEuler2Rot(<0.0, 0.0, angle>);

        vector p2 = init + (<0.0, 0.45, 0.0>*(delta*rot2)); //find last other side of semi circle
        p2 = (p2 + p1) - init;
        float angle3 = llAcos((p1*p2)/(llVecMag(p1)*llVecMag(p2))); //find angle between vectors

        llSetRot(delta * llEuler2Rot(<0.0, 0.0, angle2+angle3>)); //set rotation
        llSetPos(init); //set postion
    }

}
vector init=;
向量初始单位=;
向量目标=;
违约{
状态_条目(){
llListen(-215485231,“,空_键,”);
}
侦听(整数c、字符串n、键i、字符串m){
列表温度=llParseString2List(m,[“|”],[]);
init=(vector)llList2String(temp,0);//位置
初始单位=(向量)llList2String(温度,1);
init_unit=llVecNorm();//线范数向量
浮动角度=LATAN2(init_unit.y,init_unit.x);//查找角度
旋转增量=llEuler2Rot();//额外旋转
旋转旋转=delta*llEuler2Rot();//从矢量转换为旋转
init=init+*rot;//创建新偏移量
向量p1=目标-初始;
浮球角度2=Latan2(p1.y,p1.x);
旋转旋转2=llEuler2Rot();
向量p2=init+(*(delta*rot2));//找到半圆的最后一边
p2=(p2+p1)-init;
浮动角度3=llAcos((p1*p2)/(llVecMag(p1)*llVecMag(p2));//查找向量之间的角度
llSetRot(delta*llEuler2Rot());//设置旋转
llSetPos(init);//设置位置
}
}
半圆在y轴上为1m,两端中间为+/-。 请询问是否有不清楚的地方