这个autolisp教程程序抓取出来的X/Y坐标能精准到小数点后两位吗?求大神帮修改下!谢谢

【图文】AutoLISP程序语言设计_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AutoLISP程序语言设计
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢下载费用:18 文库币 &
Autolisp 综合实例
(start_list "_alf");开始处理压力角列表 (mapcar 'add_list alf_lst) (end_list);压力角列表处理完毕 (dlg1) ;初始化对话框一 (if (/= what 2) (setq what (start_dialog))) ) ;while结束 (if (= what 1) (progn (makegear);调用加工齿轮的函数(while (> what 1) (if (not (new_dialog "mgear" id))(exit)) (setq x1(dimx_tile "image1")) ;设置 x1为图象宽 (setq y1(dimy_tile "image1")) ;设置 y1为图象高 (start_image "image1") ;开始处理图象 (slide_image -10 -25 (+; 主函数 (defun c:mgear( / bwxsh c1 c2 cha chb chdgaoxsh chdjx chgao chh chnu chnum chsh chlzhx chtdi chtemp chtgen chtgeny chtydjl chtzuo chw dphi dx dybj e1 fdybj fname fp jybj kbj lm1 lm2 lun msh m;定义将齿轮参数写到指定文件的函数 (defun fwfile() (setq fname(getfiled "输入存放齿轮参数的文件 " "" "txt" 1)) (setq fp(open fname "w")) (write-line (strcat "模数 m: " (rtos msh 2 2)) fp) (write-line (strcat "齿数 z: " (itoa chsh))(set_tile "t4" (strcat "变位系数 x: " (rtos bwxsh 2 2))) (set_tile "t5" (strcat "分度圆直径 d: " (rtos (* 2 fdybj) 2 2))) (set_tile "t6" (strcat "齿顶圆直径 da: " (rtos (* 2 dybj) 2 2))) (set_tile "t7" (strcat "齿根圆;定义齿轮参数显示的函数 (defun showdata() (if (not (new_dialog "gear_list" id))(exit)) (setq x1(dimx_tile "image2")) ;设置 x1为图象宽 (setq y1(dimy_tile "image2")) ;设置 y1为图象高 (start_image "image2") ;开始建立图象 (sl(if (>= ydjl chw) (progn;ydjl大于等于周节 chw (setq ydjl 0.0) (setq dx (* (- 1 qxcsh) chtydjl));齿条退回一个周节 ) ) (command "copy" tiao "" '(0 0) '(0 0));原地复制齿条 (setq tiao1(entlast)) (command "subtract" lun "" (setq c2(entlast));获取轮孔圆的图元名 (command "region" c2 "");将轮孔圆转换为面域 (setq c2(entlast));获取转换为面域的轮孔圆的图元名 (command "subtract" c1 "" c2 "");齿顶圆的面域减去轮孔圆的面域 (setq lun(entlast));获取齿轮毛坯的图元名 (setq dphi(/ 360.(setq p02 (list (+ chtzuo (* chnum chw)) chtdi)) (command p02 p01 "c");齿条轮廓线绘制完毕 (setq e1(entlast));获取齿条的图元名 (command "region" e1 "");将齿条转换为面域 (setq tiao(entlast));获取转换为面域的齿条的图元名 (command "color" (setq chnu(* 0.5 chsh));齿条的齿数 (setq chnum 0.0) (command "color" "white") (setq chtemp p0) (command "pline" p01 p0 ) (while( l (* 2 d));螺钉长度大于二倍直径 (progn (setq p9 (polar p3 (+ alf pi) (* 2 d))) (setq p1 (polar p4 (+ alf pi) (* 2 d))) (setq p8 (polar p5 (+ alf pi) (* 2 d))) (setq p10 (polar p6 (+ alf pi) (* 2 d))) (c(defun drawwhorl (s_t p0 d l alf cen_md cc tc sc) (setq p1 (polar p0 (+ alf (* 0.5 pi)) (* 0.425 d))) (setq p2 (polar p0 (+ alf (* 0.5 pi)) (* 0.5 d))) (setq p3 (polar p2 alf l)) (setq p4 (polar p1 al(setq p12 (polar p11 alf d)) (command "line" p1 p2 p11 p12 "c") (command "linetype" "s" "dashed" "") (command "line" p3 p4 p9 p10 "") (command "line" p5 p6 "") (command "line" p7 p8 "") (command "line (if (= s_t "3");圆柱头内六角螺钉 GB/T 70.1-2000 (progn (setq p1 (polar p0 (+ alf (* 0.5 pi)) (* 0.75 d))) (setq p2 (polar p1 (+ alf pi) d)) (setq p3 (polar p2 (+ alf (* -0.5 pi)) (* 0.2925 d))) (setq p4 (po(if (= s_t "2");六角头螺栓 GB/T
(progn (setq p1 (polar p0 (+ alf (* 0.5 pi)) (* 0.5 d))) (setq p2 (polar p1 (+ alf (* 0.5 pi)) (* 0.5 d))) (setq p3 (polar p2 (+ alf pi) (* 0.7 d))) (setq p4 (pol(if (= s_t "1");沉头开槽螺钉头 GB/T 68-2000 (progn (setq p01(polar p0 alf (* 0.5 d))) (setq p1 (polar p01 (+ alf (* 0.5 pi)) (* 0.5 d))) (setq p2 (polar p1 (+ alf (* 0.75 pi)) (* 0.707107 d))) (setq p3 (pola (setq p3 (polar p2 (+ alf (* -0.5 pi)) (* 0.65 d))) (setq p4 (polar p3 alf (* 0.25 d))) (setq p5 (polar p4 (+ alf (* -0.5 pi)) (* 0.2 d))) (setq p6 (polar p5 (+ alf pi) (* 0.25 d))) (setq p7 (po;定义绘制螺钉的函数 (defun drawscrew(s_t d l p0 alf cen_md cc tc sc / p1 p2 p3 p4 p5 p6 p7 p8 p9 p10) (setvar "osmode" 0) (setvar "cmdecho" 0) (setq alf (/ (* pi alf) 180));度转换为弧度 (command "color" sc) (if (=(if (= sdt 4) (progn;用光标确定旋转角 (initget 1);禁止空输入 (setq ang (getangle p0 "输入旋转角 : ")) (setq alf (* 180.0 (/ ang pi))) )));while循环结束 (unload_dialog id);卸载对话框文件 (if (= user_md "0") (setq d (nth (atoi (if ( sdt 1);while循环开始 (initdlg2 s_t);初始化子对话框 (if (= sdt 3) (progn ;用光标确定定位点 (initget 1);禁止空输入 (setq p0 (getpoint "输入定位点 : ")) (setq x (car p0) y (cadr p0)) ) ) (if (= sdt 4) (progn;用光标确定旋转角 ;定义获取所有控件当前数据的函数 (defun getdata () (setq l_n (get_tile "s_l"));获取大径表被选项的序号 (setq d_n (get_tile "s_d"));获取长度表被选项的序号 (setq x (atof (get_tile "p_x")));获取 x编辑框的值 (setq y (atof (get_tile "p_y")));获取(progn ;自定义尺寸切换开关为打开状态时 (mode_tile "s_d" 1);禁用大径列表 (mode_tile "s_l" 1);禁用长度列表 (mode_tile “user_d” 0);设置自定义大径编辑框为可用状态 (mode_tile "user_l" 0);设置自定义长度编辑框为可用状态 (set_tile "user_d" (rtos d1 2 2));设置自定义(setq img_key (strcat "screw_" s_t)) ;拼接图像按钮的关键字 (mode_tile img_key 2);设置相应的图像按钮为聚焦状态 ) ;定义自定义尺寸函数 (defun f_user (user_md) (if (= user_md "0") (progn ;自定义尺寸切换开关为关闭状态时 (mode_tile "user_d" 1);禁用自定;定义初始化颜色图像按钮数 (defun c_img (key color) (if color (progn (start_image key) (fill_image 0 0 (dimx_tile key) (dimy_tile key) color) (end_image) ) ) ) ;定义螺钉种类列表的动作函数 (defun f_stype () (setq s_t (ge;定义初始化图像函数 (defun f_img (key sld) (start_image key) (slide_image 0 0 (dimx_tile key) (dimy_tile key) sld) (end_image) ) ;定义 获取 AutoCAD标准颜色函数 (defun c_c(color / ccc) (setq ccc(acad_colordlg color (action_tile "p_a" "(getdata)(done_dialog 4)");定义光标拾取旋转角按钮的动作 (action_tile "ccolor" "(setq cc (c_c cc)) (c_img $key cc)");定义中心线图像按钮的动作是调用选择颜色对话框并将选择的颜色赋给该按钮 (action_tile "tcolor" "(setq tc(c_c tc) (f_img "id_img" sldname);将幻灯片文件显示到图像按钮上 (c_img "ccolor" cc);填充中心线图像按钮的颜色 (c_img "tcolor" tc) (c_img "scolor" sc) (set_tile "p_x" (rtos x 2 2));设置定位点 x编辑框的值 (set_tile "p_y" (rtos y 2 2)) (set_tile (action_tile "screw_3" "(setq s_t \"3\")(set_tile \"s_type\" \"3\")") (action_tile "s_type" "(f_stype )") ; 定义螺钉种类列表的动作 (action_tile "accept" "(done_dialog 2)") ; 定义继续按钮的动作 (action_tile "cancel" "(;定义初始化主对话框函数 (defun initdlg1 () (if(not (new_dialog "main_dlg" id))(exit)) (f_img "screw_0" "d:\\example\\sld\\13-1scr0");初始化图像按钮 (f_img "screw_1" "d:\\example\\sld\\13-1scr1") (f_img "screw_2" "d:\3. 源程序代码 【 13-1】 定义以对话框为界面绘制多种螺钉的命令 , 命令名为 “ SCREW”, 需装人 13-1.dcl文件 。 ;AutoLISP源程序代码 (defun c:screw(/ sdt d l x y p0 alf d_n l_n cc tc sc user_md d1 l1 cen_md) ; 初始化变量 、 标准大径表和标准长度表 (setq sdt 2 s( 9) getdata:获取所有控件当前值的函数 。 ( 10) drarscrew:绘制螺钉函数 。 螺钉种类 s_t、 大径 d、 长度 l、 定位点 p0、旋转角 alf、 中心线状态 cen_md、 中心线颜色 cc、 细实线颜色 tc、 粗实线颜色sc是该函数的参数 。 ( 11) drawwhorl:绘制螺钉本体 ( 不包括头部 ) 的函数 。 螺钉种类 s_t、 定位点 p0、13.1.3 定义 AutoLISP程序源文件 1. 函数说明 ( 1) screw:绘制螺钉主函数 , 定义名字为 screw的 AutoCAD命令 。 ( 2) initdlg1:初始化主对话框函数 。 ( 3) initdlg2:初始化子对话框函数 , 螺钉种类 s_t是该函数的参数 。 ( 4) f_img:初始化图像函数 , 将幻灯片显示到图像上 。 图像的关键字key和包:row{//加框列内第二行 :text{value="细实线颜色: ";} :image_button{color=4;height=2;key="tcolor";}} :row{//加框列内第三行 :text{value="粗实线颜色: ";} :image_button{color=5;height=2;key="scolor";}} } //第二个加框列结束 }//第二列结束 } :edit_box{label = "自定义长度 &L:"; key = "user_l"; edit_width =8; value="50";}} :boxed_column{//第二个加框列 , 该列有一个切换开关和三个行 :toggle{label="绘制中心线 ";//切换开关 key="cenline"; value=1;} :row{//加框列内第一行 , 有一个文本和一个图像按:button{label = "光标拾取 <"; key = "p_a";}} ok_cancel;//“OK”和 “ Cancel”按钮行 }//第一列结束 :column{//第二列开始 , 该列有两个加框列 :boxed_column{//第一个加框列 , 该列有一个切换开关和两个编辑框 :toggle{label="自定义尺寸 ";//切换开关 key="user_dim"; :edit_box{label = “定位点 &x坐标 :”;//定位点 x编辑框 key = "p_x"; edit_width =8; value="150";} :edit_box{label = “定位点 &y坐标 :”;//定位点 y编辑框 key = "p_y"; edit_width =8; value="100";} :button{label = “光标拾取 <”;//光标拾fixed_height=true;}//大径列表结束 :list_box{label = "螺钉长度 &L"; //长度列表开始 key = "s_l"; edit_width =5; height=8; list="2\n2.5\n3\n4\n5\n6\n8\n10\n12\n(14)\n16\n\20\n\25\n30\n35\n\40\n45\n50\n"; fixed_height=//子对话框的名字是 “ children_dlg”, 共有两个行 (row) children_dlg:dialog{ label="确定螺钉参数 "; :row{ //第一行开始 , 该行有一个图像和两个列表 :image{color=-2; width=22; aspect_ratio=0.6; key="id_img";}//图像 :list_box{label = “螺钉大径 &:row{ //第二行开始 , 该行有两个按钮和两个间隔 spacer_1; //第一个间隔 :button{label="继续 "; key="accept"; is_default=true; fixed_width=true;} //"继续 "按钮 :button{label=“退出 ” ; key="cancel"; fixed_width=true;} //"退出 "按钮 s:image_button{//图像按钮 4 color=-2; width=15; aspect_ratio=0.66; key="screw_3";} }}//加框列内第二行和加框列结束 :list_box{label = "螺钉种类 "; //列表开始 list="GB/T 65-2000\nGB/T 68-2000\nGB/T \nGB/T 70.1-2000";/aspect_ratio=0.66; key="screw_0";} :image_button{ //图像按钮 2 color=-2; width=15; aspect_ratio=0.66; key="screw_1";} }//列内第一行结束 :row{ //加框列内第二行开始 , 该行有两个图像按钮 :image_button{//图像按钮 3 color=-2;width=15;as13.1.2 定义对话框文件 【 例 13-1】 定义绘制多种螺钉命令的对话框定义文件 。 //主对话框的名字是 “ main_dlg”, 共有两个行 (row) main_dlg:dialog{ label="确定螺钉种类 :"; :row{ //第一行开始 , 该行有一个加框列和一个列表 :boxed_column{ //加框列开始 , 该列有两行 , 每行有两个图像按钮 label( 5) 确定绘制螺钉的其他参数 因为螺钉的中心线可能与部件图上已有的中心线重合 , 所以提供了 “ 绘制中心线 ” 切换开关 。 当该开关处于打开状态时绘制中心线 。 对话框右下角的三个颜色块是确定三种线型颜色的图像按钮 , 单击之后弹出AutoCAD标准颜色对话框 , 选择一种颜色之后 , 相应的图像按钮的颜色随之改变 。 图像按钮的含义 , 在其左侧用 text( 文本 ) 控件辅助说明( 4) 确定螺钉的几何参数 通过 “ 螺钉大径 d”的列表选择螺钉的大径 d。 通过 “ 螺钉长度 L”的列表选择螺钉的的长度 L。 如果需要绘制非标准尺寸的螺钉 ,打开 “ 自定义尺寸 ” 切换开关 。 “ 螺钉大径 d”和 “ 螺钉长度 L”列表从可用改变为禁用的状态 , “ 自定义大径 d”和 “ 自定义长度 L”编辑框从禁用改变为可用的状态 。 通过 “ 自定义大径 d”和 “ 自图 13-2确定螺钉参数对话框 ( 3) 确定螺钉的种类 图 13-1所示对话框提供了互动的图像按钮和螺钉种类的列表 , 通过该对话框选择一种螺钉 , 单击 “ 继续 ” 按钮 , 弹出图 13-2所示确定螺钉参数的对话框 。 2. 使用说明 ( 1) 安装和加载 从电子教案中找出上述文件并复制到指定的路径 , 加载 13-1.lsp。 ( 2) 调用绘制螺钉的命令 种类确定螺钉的种类 在 “ command:”提示下 , 输入 screw命令 , 弹出图 13-1所示确定螺钉种类对话框 。 图 13-1确定螺钉种类对话框 13.1.1 文件和使用说明 1. 文件说明 本程序由以下三种类型的 10个文件组成 。 ( 1) 对话框定义文件 文件名为 13-1.dcl, 存放在 d:example\dcl\路径下 。 该文件定义了确定螺钉种类的主对话框 main_dlg和确定螺钉参数的子对话框 children_dlg。 ( 2) AutoLISP源文件 文件名为 13-1.lsp, 存放在自定的路径下 。 13 .1 定义绘制多种螺钉的命令 螺钉是最常用的标准件 , 它的结构 、 尺寸参数在国家标准中有详细的规定 。 螺钉是由标准件厂专门生产的 , 一般的厂家只是选用螺钉 。 因此只有在绘制部件图时才绘制螺钉 。 传统的手工绘制螺钉的步骤是: ① 根据具体的应用场合确定螺钉的种类 , 初步计算所需螺钉的大径和长度; ② 查阅机械零件设计手册 , 确定螺钉的大径 、 长度和其他有关结 本章介绍两个以对话框设计为主的两个综合应用实例 。 实例一是定义绘制多种螺钉的命令 。 该实例建立了互动关系的图像按钮和列表 , 供用户直观地选择螺钉种类;通过 “ 自定义尺寸 ” 切换开关控制一些控件的状态 , 若该切换开关关闭 , 表示绘制标准螺钉 , 标准螺钉的数据只需在列表中选择 , 自定义尺寸的编辑框处于禁用状态;反之 , 螺钉的标准数据列表处于禁用状态 , 此时在自定义尺寸的第 13章 综合应用实例
文档加载中……请稍候!
下载文档到电脑,查找使用更方便
18 文库币 &&0人已下载
还剩页未读,继续阅读
<a href="UserManage/CopyrightAppeal.aspx?bid=1907579" title="版权申诉" class="fLeft works-manage-item works-manage-report" target="_blank"
关&键&词: AUTOLISP 综合 实例
& 技术文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:Autolisp 综合实例 链接地址:
当前资源信息
编号: 14437
类型: 共享资源
格式: PPT
大小: 427.50KB
上传时间:
&& 盗版或侵权
&& 标题与内容不符合
&& 文档归类错误
&& 色情、淫秽、低俗信息
&& 反政府、反人类、反社会等反动信息
&& 散布赌博、暴力、凶杀、恐怖或者教唆犯罪等信息
&& 侮辱、诽谤等人身攻击信息
&& 散布谣言、扰乱社会秩序,破坏社会稳定等信息程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
围观76154次
编辑日期: 字体:
写在前面的话,前两天有个朋友在QQ上问我 如何获取主角面朝方向一定区域中的敌人对象。这个命题看似简单,其实里面蕴含了很多数学方面的东西。今天刚好有时间我就彻底的把这个疑问写在博客中。希望可以帮助到他。
在上代码之前请大家跟我先做几个简单的练习题,角度向量的计算一定要学会,不然后面的东西会很难懂。
1.已知3D坐标,和一个旋转角度,以及一段距离,求目标点的3D坐标。
已知当前点为Target,目标点沿着Target的Y轴旋转30度,沿着Target的X轴延伸10米求目标点的3D坐标?
1234567891011121314151617
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& public Transform Target;& void LateUpdate () {
Quaternion rotation = Quaternion.Euler(0f,30f,0f) * Target.rotation;
Vector3&&newPos = rotation * new Vector3(10f,0f,0f);
Debug.DrawLine(newPos,Vector3.zero,Color.red);
Debug.Log("newpos " + newPos +" nowpos " + Target.position + " distance " + Vector3.Distance(newPos,Target.position)); }&}
输出结果 :新坐标 (8.7, 0.0, -5.0) 当前坐标 (0.0, 0.0, 0.0)两点之间的距离 10。
2.已知3D模型的角度求它的向量。
已知3D模型Target,Y轴旋转30度后向前平移。
1234567891011121314151617181920
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& public Transform Target;& void LateUpdate () {&
if(Input.GetMouseButton(0))
Quaternion rotation = Quaternion.Euler(0f,30f,0f) * Target.rotation;
Vector3&&newPos = rotation * Vector3.forward;
Target.Translate(newPos.x,newPos.y,newPos.z);
3.已知一个目标点,让模型朝着这个目标点移动。
这是一个比较简单的例子,大家应该都能看明白。
Target.transform.LookAt(new Vector3 (100f,200f,300f));
Target.Translate(Vector3.forward);
这里我要说的就是Vector3.forward ,它等价与 new Vector3(0,0,1);它并不是一个坐标,它是一个标准向量,方向是沿着Z轴向前。这样平移一次的距离就是1米, 如果Vector3.forward * 100那么一次平移的距离就是100米。
在看看下面这段代码
Vector3 vecn = (TargetCube.position - Target.position).normalized;&
Target.Translate(vecn *0.1f);
用向量减去一个向量求出它们的差值,normalized 是格式化向量,意思是把它们之间向量格式化到1米内。这样就可以更加精确的计算一次平移的距离了 vecn *0.1f 就标示一次平移1分米,蛤蛤。
向量不仅可以进行X Y Z轴的移动,同样可以进行旋转 ,下面这段代码就是让向量沿着Y轴旋转30度。
Vector3 vecn = (TargetCube.position - Target.position).normalized;&
vecn = Quaternion.Euler(0f,30f,0f) * vecn;&
Target.Translate(vecn *0.1f);
如果上述三道简单的练习题 你都能了然于心的话,那么本文最大的难题我相信也不会是什么难事,继续阅读吧。
假设我们需要计算主角面前5米内所有的对象时。以主角为圆心计算面前5米外的一个点,为了让大家看清楚我现将这条线绘制出来。
private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red); }
如下图所,我们已经将这两个点计算出来了。此时你可以动态的编辑主角Y轴的坐标,这个点永远都是沿着主角当前角度面前5米以外的点。
接下来,我们需要计算主角面前的一个发散性的角度。假设主角看到的是向左30度,向右30度在这个区域。
12345678910111213141516171819
private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);&
Debug.DrawLine(f0,f1,Color.red);
Debug.DrawLine(f0,f2,Color.red); }
如下图所示,这时主角面前的区域就计算出来了。看起来就是两个三角形之间的区域。
最后就是简单的套用公式,计算一个点是否在三角形内,在本文中就是计算敌人的点是否在面前的这两个三角形内。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);&
Debug.DrawLine(f0,f1,Color.red);
Debug.DrawLine(f0,f2,Color.red);&
Vector3 point = cube.position;&
if(isINTriangle(point,transform.position,f1,f0) || isINTriangle(point,transform.position,f2,f0) )
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }& private&&float triangleArea(float v0x,float v0y,float v1x,float v1y,float v2x,float v2y)
{&&&&&&&&return Mathf.Abs((v0x * v1y + v1x * v2y + v2x * v0y&&&&&&&&&&&&- v1x * v0y - v2x * v1y - v0x * v2y) / 2f);&&&&}& bool isINTriangle(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float t = triangleArea(v0x,v0y,v1x,v1y,v2x,v2y);
float a = triangleArea(v0x,v0y,v1x,v1y,x,y) + triangleArea(v0x,v0y,x,y,v2x,v2y) + triangleArea(x,y,v1x,v1y,v2x,v2y);&
if (Mathf.Abs(t - a) &= 0.01f)
return true;
return false;
如下图所示,如果箱子对象是主角的视野中就会检测到。
注意,上图中我的视野选择了两个三角形,如果你需要视野目标点是椭圆形的话,那么可以多设置一些三角形。但是这样就会非常消耗效率,我觉得这里完全可以使用1个三角形,,只是正对的目标点会出现一些偏差,影响其实并不会很大。如下图所示
代码简单的修改一下即可。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);
Debug.DrawLine(f1,f2,Color.red);&
Vector3 point = cube.position;&
if(isINTriangle(point,transform.position,f1,f2))
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }& private&&float triangleArea(float v0x,float v0y,float v1x,float v1y,float v2x,float v2y)
{&&&&&&&&return Mathf.Abs((v0x * v1y + v1x * v2y + v2x * v0y&&&&&&&&&&&&- v1x * v0y - v2x * v1y - v0x * v2y) / 2f);&&&&}& bool isINTriangle(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float t = triangleArea(v0x,v0y,v1x,v1y,v2x,v2y);
float a = triangleArea(v0x,v0y,v1x,v1y,x,y) + triangleArea(v0x,v0y,x,y,v2x,v2y) + triangleArea(x,y,v1x,v1y,v2x,v2y);&
if (Mathf.Abs(t - a) &= 0.01f)
return true;
return false;
上面我们介绍了三角形判断,当然也可以通过矩形来判断是否相交。。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 left =&&(transform.position&&+ (r *Vector3.left) * distance);
Debug.DrawLine(transform.position,left,Color.red);&
Vector3 right =&&(transform.position&&+ (r *Vector3.right) * distance);
Debug.DrawLine(transform.position,right,Color.red);&
Vector3 leftEnd = (left&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(left,leftEnd,Color.red);&
Vector3 rightEnd = (right&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(right,rightEnd,Color.red);&
Debug.DrawLine(leftEnd,rightEnd,Color.red);&
Vector3 point = cube.position;&
if(isINRect(point,leftEnd,rightEnd,right,left))
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }&&&&& private float Multiply(float p1x , float p1y, float p2x,float p2y, float p0x,float p0y)&&&& {&&&&&&&&return ((p1x - p0x) * (p2y - p0y) - (p2x - p0x) * (p1y - p0y));&&&& }& bool isINRect(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2,Vector3 v3) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float v3x = v3.x;
float v3y = v3.z;&
if (Multiply(x,y, v0x,v0y, v1x,v1y) * Multiply(x,y, v3x,v3y, v2x,v2y) &= 0 && Multiply(x,y, v3x,v3y, v0x,v0y) * Multiply(x,y, v2x,v2y, v1x,v1y) &= 0)&&&&&&&&&&&& return true;
else&&&&&&&&&&&&return false;& }&}
如果大家看了这篇文章后发现在你的项目中还有一些比较麻烦的角度与向量的算法,欢迎在下面留言给我,如果我有时间我会第一时间把方法贴在博客中。互相学习互相进步,加油!哇咔咔。。
马上过年了,雨松MOMO在这里祝福大家2013年幸幸福福的过日子,嘿嘿。
2013年4月补充
感谢楼下朋友给我的留言。, 我在补充一下这篇博客。
12345678910111213141516171819202122232425
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& public Transform target;& void Update() {&
float distance = Vector3.Distance(target.position,transform.position);&
Quaternion right
= transform.rotation * Quaternion.AngleAxis(30,Vector3.up);
Quaternion left
= transform.rotation * Quaternion.AngleAxis(30,Vector3.down);&
Vector3 n =
transform.position + (Vector3.forward * distance);
Vector3 leftPoint = left *
Vector3 rightPoint =&&right *n ;&
Debug.DrawLine(transform.position,leftPoint,Color.red);
Debug.DrawLine(transform.position,rightPoint,Color.red);
Debug.DrawLine(rightPoint,leftPoint,Color.red);& }}
这里我以角色左右个30度。 这样就可以根据两个模型的距离以及角度来判断了。。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:}

我要回帖

更多关于 autolisp 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信