{"id":4174,"date":"2018-06-21T22:13:18","date_gmt":"2018-06-21T14:13:18","guid":{"rendered":"http:\/\/www.bookcard.net\/wordpress\/?p=4174"},"modified":"2018-07-13T23:28:36","modified_gmt":"2018-07-13T15:28:36","slug":"game_model_vector3d","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/game_model_vector3d\/","title":{"rendered":"\u904a\u6232\u5efa\u6a21-\u77e2\u91cf\u904b\u7b97"},"content":{"rendered":"<figure id=\"attachment_4175\" aria-describedby=\"caption-attachment-4175\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/06\/GAME_MODEL_VECTOR.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4175\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/06\/GAME_MODEL_VECTOR.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/06\/GAME_MODEL_VECTOR.jpg 1024w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/06\/GAME_MODEL_VECTOR-300x225.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/06\/GAME_MODEL_VECTOR-768x576.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-4175\" class=\"wp-caption-text\">\u904a\u6232\u5efa\u6a21-\u77e2\u91cf\u904b\u7b97<\/figcaption><\/figure>\n<p>\u77e2\u91cf(VECTOR)\u4e5f\u7a31\u300e\u5411\u91cf\u300f\u5176\u5be6\u662f\u62bd\u8c61\u300e\u91cf\u300f\u5b83\u5728\u904a\u6232\u4e16\u754c\u88ab\u9802\u7fa9\u70ba\u300e\u4f4d\u7f6e\u300f\u300e\u901f\u5ea6\u300f\u300e\u78e8\u64e6\u300f\u300e\u65b9\u5411\u300f\u300e\u9ede\u300f\u7b49\u7b49. \u77e2\u91cf\u901a\u5e38\u67093\u7a2e<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"160\">\u77e2\u91cf<\/td>\n<td width=\"123\">\u5206\u91cf<\/td>\n<td width=\"270\">\u7c21\u5e8f<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">2D\u77e2\u91cf<\/td>\n<td width=\"123\">x,y<\/td>\n<td width=\"270\">2D\u7a7a\u9593<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">3D\u77e2\u91cf<\/td>\n<td width=\"123\">x,y,z<\/td>\n<td width=\"270\">3D\u7a7a\u9593<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">4D\u77e2\u91cf<\/td>\n<td width=\"123\">x,y,z,w<\/td>\n<td width=\"270\">3D\u7a7a\u9593w\u7e3d\u662f\u70ba1.\u7528\u65bc\u65b9\u9663\u904b\u7b97<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9996\u5148\u5b9a\u7fa93D\u77e2\u91cf\u7d50\u69cb:<\/p>\n<p>typedef struct VECTOR3D_TYP{<\/p>\n<p>float x,y,z;<\/p>\n<p>}VECTOR3D,*VECTOR3D_PTR;<\/p>\n<p>\u4e0b\u9762\u662f3D\u77e2\u91cf(VECTOR)\u904b\u7b97\u51fd\u5f0f\u5eab.<\/p>\n<p>&nbsp;<\/p>\n<p>\u8a08\u7b97<strong>3D\u77e2\u91cf<\/strong>\u9577\u5ea6,<strong>\u77e2\u91cf<\/strong>\u9577\u5ea6\u4e5f\u7a31\u70ba\u7bc4\u6578(norm).\u5c07\u5176\u7406\u89e3\u70ba\u539f\u9ede(0,0,0)\u5230<strong>\u77e2\u91cf(x,y,z)\u4e4b\u8ddd\u96e2<\/strong><\/p>\n<p>float Length_VECTOR3D(VECTOR3D_PTR va){<\/p>\n<p>return( (float)sqrtf(va-&gt;x<em>va-&gt;x + va-&gt;y<\/em>va-&gt;y + va-&gt;z*va-&gt;z) );<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u5c0d<strong>3D\u77e2\u91cf<\/strong>\u9032\u884c\u6b78\u4e00\u5316(normalize),\u4e5f\u5c31\u4f7f\u5176\u9577\u5ea6\u7e2e\u653e\u70ba1,\u4f46\u540c\u6642\u65b9\u5411\u4fdd\u6301\u4e0d\u8b8a.\u5b83\u901a\u5e38\u88ab\u7528\u65bc\u7121\u9700\u7406\u6703\u9577\u5ea6\u4e4b\u904b\u7b97\u5982\u300e\u65b9\u5411\u300f<\/p>\n<p>void Normalize_VECTOR3D(VECTOR3D_PTR va){<\/p>\n<p>\/\/ 1.\u9996\u5148\u8a08\u7b97\u9577\u5ea6<\/p>\n<p>float length = sqrtf(va-&gt;x<em>va-&gt;x + va-&gt;y<\/em>va-&gt;y + va-&gt;z*va-&gt;z);<\/p>\n<p>\/\/2.<strong>\u77e2\u91cf\u9664\u4ee5\u9577\u5ea6\u5f97\u5230<\/strong>\u6b78\u4e00\u5316<strong>\u77e2\u91cf<\/strong><\/p>\n<p>va-&gt;x= va-&gt;x\/length;<\/p>\n<p>va-&gt;y= va-&gt;y\/length;<\/p>\n<p>va-&gt;z= va-&gt;z\/length;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p><strong>3D<\/strong><strong>\u77e2\u91cf<\/strong>\u9ede\u7a4d\u904b\u7b97\u53ef\u4ee5\u7406\u89e3\u70ba<strong>\u77e2\u91cf\u4e58\u6cd5<\/strong>.\u5148\u5c07\u5404\u5206\u91cf\u76f8\u4e58\u5f8c\u518d\u76f8\u52a0\u5f97\u5230\u4e00\u500b\u6a19\u91cf<\/p>\n<p>float operator%(VECTOR3D va, VECTOR3D vb){<\/p>\n<p>return((va.x * vb.x) + (va.y * vb.y) + (va.z * vb.z));<\/p>\n<p>}<\/p>\n<p>float Dot_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){<\/p>\n<p>return( (va-&gt;x * vb-&gt;x) + (va-&gt;y * vb-&gt;y) + (va-&gt;z * vb-&gt;z) );<\/p>\n<p>}<\/p>\n<p>\u53c9\u7a4d\u662f\u53e6\u4e00\u7a2e<strong>\u77e2\u91cf\u4e58\u6cd5<\/strong>,\u53c9\u7a4d\u904b\u7b97\u6700\u5c0f\u8981\u67093\u500b\u5206\u91cf\u624d\u6709\u6548.<\/p>\n<p>VECTOR3D operator^(VECTOR3D va, VECTOR3D vb){<\/p>\n<p>VECTOR3D vn;<\/p>\n<p>vn.x = ((va.y * vb.z) &#8211; (va.z * vb.y));<\/p>\n<p>vn.y = -((va.x * vb.z) &#8211; (va.z * vb.x));<\/p>\n<p>vn.z = ((va.x * vb.y) &#8211; (va.y * vb.x));<\/p>\n<p>return(vn);<\/p>\n<p>}<\/p>\n<p>VECTOR3D Cross_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){<\/p>\n<p>VECTOR3D vn;<\/p>\n<p>vn.x = \u00a0( (va-&gt;y * vb-&gt;z) &#8211; (va-&gt;z * vb-&gt;y) );<\/p>\n<p>vn.y = -( (va-&gt;x * vb-&gt;z) &#8211; (va-&gt;z * vb-&gt;x) );<\/p>\n<p>vn.z =\u00a0 ( (va-&gt;x * vb-&gt;y) &#8211; (va-&gt;y * vb-&gt;x) );<\/p>\n<p>return(vn);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u8a08\u7b97\u5169\u500b<strong>3D\u77e2\u91cf<\/strong>va\u548cvb\u4e4b\u9593\u593e\u89d2\u4f59\u5f26\u503c<\/p>\n<p>float CosTh_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){<\/p>\n<p>return(Dot_VECTOR3D(va,vb)\/(Length_VECTOR3D(va)*Length_VECTOR3D(vb)));<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u8a08\u7b97\u4e09\u89d2\u5f62\u6cd5\u7dda<\/p>\n<p>void Normal_VECTOR3D(VECTOR3D_PTR normal,VECTOR3D_PTR va, VECTOR3D_PTR vb, VECTOR3D_PTR vc){<\/p>\n<p>VECTOR3D u, v, n;<\/p>\n<p>float length;<\/p>\n<p>u = *vb &#8211; *va;<\/p>\n<p>v = *vc &#8211; *va;<\/p>\n<p>n = u^v;\/\/Cross_VECTOR3D(&amp;u, &amp;v, &amp;n);\/\/ \u8a08\u7b97\u53c9\u7a4d<\/p>\n<p>length = sqrtf(n.x<em>n.x + n.y<\/em>n.y + n.z*n.z);<\/p>\n<p>normal-&gt;x = n.x\/length;<\/p>\n<p>normal-&gt;y = n.y\/length;<\/p>\n<p>normal-&gt;z = n.z\/length;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u5c07\u5169\u500b<strong>3D\u77e2\u91cf<\/strong>\u76f8\u52a0(va + vb),\u5982\u7528\u65bc\u4f4d\u7f6e\u79fb\u52d5<\/p>\n<p>VECTOR3D operator+(VECTOR3D va, VECTOR3D vb){<\/p>\n<p>VECTOR3D vsum;<\/p>\n<p>vsum.x = va.x + vb.x;<\/p>\n<p>vsum.y = va.y + vb.y;<\/p>\n<p>vsum.z = va.z + vb.z;<\/p>\n<p>return (vsum);\/\/\u8fd4\u56de\u76f8\u52a0\u7d50\u679c!<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u5c07\u5169\u500b<strong>3D\u77e2\u91cf<\/strong>\u76f8\u6e1b(va &#8211; vb),\u5982\u7528\u65bc\u4f4d\u7f6e\u79fb\u52d5<\/p>\n<p>VECTOR3D operator-(VECTOR3D va, VECTOR3D vb){<\/p>\n<p>VECTOR3D vdiff;<\/p>\n<p>vdiff.x = va.x &#8211; vb.x;<\/p>\n<p>vdiff.y = va.y &#8211; vb.y;<\/p>\n<p>vdiff.z = va.z &#8211; vb.z;<\/p>\n<p>return(vdiff);\u00a0\u00a0\u00a0\u00a0 \/\/\u8fd4\u56de\u76f8\u6e1b\u5411\u91cf!<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p><strong>3D<\/strong><strong>\u77e2\u91cf<\/strong>\u53cd\u6578,\u5982\u8fd4\u8f49\u65b9\u5411<\/p>\n<p>VECTOR3D operator-(VECTOR3D v){<\/p>\n<p>VECTOR3D negation;<\/p>\n<p>negation.x = -v.x ;<\/p>\n<p>negation.y = -v.y ;<\/p>\n<p>negation.z = -v.z ;<\/p>\n<p>return(negation);\u00a0\u00a0\u00a0\u00a0 \/\/\u8fd4\u56de\u53cd\u6578\u5411\u91cf!<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u4f7f\u7528\u7e2e\u653e\u56e0\u5b50k\u5c0d<strong>3D\u77e2\u91cf<\/strong>\u9032\u884c\u7e2e\u653e\u5982:\u4f4d\u7f6e=\u4f4d\u7f6e+\u901f\u5ea6*\u6642\u9593<\/p>\n<p>VECTOR3D operator*(VECTOR3D va, float k){<\/p>\n<p>VECTOR3D vscaled;<\/p>\n<p>vscaled.x = k * va.x;<\/p>\n<p>vscaled.y = k * va.y;<\/p>\n<p>vscaled.z = k * va.z;<\/p>\n<p>return vscaled;\/\/ \u8fd4\u56de\u7e2e\u653e\u5f8c\u5411\u91cf<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>3D\u77e2\u91cf\u8ce6\u503c<\/p>\n<p>void Init_VECTOR3D(VECTOR3D_PTR v, float x,float y,float z) {<\/p>\n<p>v-&gt;x = x;\u00a0 v-&gt;y = y; v-&gt;z = z;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>3D\u77e2\u91cf\u62f7\u8c9d<\/p>\n<p>Copy_VECTOR3D(VECTOR3D_PTR vdst, VECTOR3D_PTR vsrc){<\/p>\n<p>vdst-&gt;x = vsrc-&gt;x;\u00a0 vdst-&gt;y = vsrc-&gt;y; vdst-&gt;z = vsrc-&gt;z;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>3D\u77e2\u91cf\u6bd4\u8f03<\/p>\n<p>bool operator==(VECTOR3D vdst, VECTOR3D vsrc){<\/p>\n<p>if (vdst.x == vsrc.x &amp;&amp; vdst.y == vsrc.y &amp;&amp; vdst.z == vsrc.z)<\/p>\n<p>return true;<\/p>\n<p>else<\/p>\n<p>return false;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>3D\u5411\u91cf\u4e0d\u7b49\u6bd4\u8f03<\/p>\n<p>bool operator!=(VECTOR3D vdst, VECTOR3D vsrc)<\/p>\n<p>{<\/p>\n<p>if (vdst.x != vsrc.x ||\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vdst.y != vsrc.y ||vdst.z != vsrc.z)<\/p>\n<p>return true;<\/p>\n<p>else<\/p>\n<p>return false;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\u5411\u91cf\u6b78\u96f6(3D\u5411\u91cf)\u7121\u65b9\u5411,\u7121\u8ddd\u96e2,\u4ee3\u8868\u4f4d\u65bc\u539f\u9ede<\/p>\n<p>void Zero_VECTOR3D(VECTOR3D_PTR v) {<\/p>\n<p>v-&gt;x = v-&gt;y = v-&gt;z = 0.0f;<\/p>\n<p>}<\/p>\n<p>\u8a08\u7b97\u5169\u77e2\u91cf\u4e4b\u9593\u593e\u89d2<\/p>\n<p>float Angle_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){<\/p>\n<p>return acosf(*va % *vb);<\/p>\n<p>}<\/p>\n<p>\u89d2\u5ea6\u8f49\u5f27\u5ea6<\/p>\n<p>#define DEG_TO_RAD(ang) ((ang)*PI\/180.0)<\/p>\n<p>\u5f27\u5ea6\u8f49\u89d2\u5ea6<\/p>\n<p>#define RAD_TO_DEG(rads) ((rads)*180.0\/PI)<\/p>\n<p>\u96a8\u6a5f\u6578 x:\u4e0b\u9650,\u00a0 y:\u4e0a\u9650.<\/p>\n<p>#define RAND_RANGE(x,y) ( (x) + (rand()%((y)-(x)+1)))<\/p>\n<p>\u96a8\u6a5f\u6578: -1.0 ~ 1.0<\/p>\n<p>#define FRAND_RANGE1()\u00a0\u00a0 (((float)rand()-(float)rand())\/RAND_MAX)<\/p>\n<p>\u96a8\u6a5f\u6578 0~1<\/p>\n<p>#define FRAND_RANGE() ((float)rand() \/ (float)RAND_MAX)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u77e2\u91cf(VECTOR)\u4e5f\u7a31\u300e\u5411\u91cf\u300f\u5176\u5be6\u662f\u62bd\u8c61\u300e\u91cf\u300f\u5b83\u5728\u904a\u6232\u4e16\u754c\u88ab\u9802\u7fa9\u70ba\u300e\u4f4d\u7f6e\u300f\u300e\u901f\u5ea6\u300f\u300e\u78e8\u64e6\u300f\u300e\u65b9\u5411\u300f\u300e\u9ede\u300f\u7b49\u7b49 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/game_model_vector3d\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">\u904a\u6232\u5efa\u6a21-\u77e2\u91cf\u904b\u7b97<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,13],"tags":[42],"class_list":["post-4174","post","type-post","status-publish","format-standard","hentry","category-algorithm","category-pc","tag-computer","entry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/comments?post=4174"}],"version-history":[{"count":3,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4174\/revisions"}],"predecessor-version":[{"id":4204,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4174\/revisions\/4204"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=4174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=4174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=4174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}