{"id":1034,"date":"2010-01-04T07:38:53","date_gmt":"2010-01-04T07:38:53","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=1034"},"modified":"2017-01-29T09:46:30","modified_gmt":"2017-01-29T00:46:30","slug":"wpf%ec%97%90%ec%84%9c-%ed%8a%b8%eb%9e%99%eb%b3%bc-%ea%b8%b0%eb%8a%a5-%ea%b5%ac%ed%98%84","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=1034","title":{"rendered":"WPF\uc5d0\uc11c \ud2b8\ub799\ubcfc \uae30\ub2a5 \uad6c\ud604"},"content":{"rendered":"<div>\n<div style=\"text-align: center;\"><span style=\"font-size: large;\"><strong>\ub9c8\uc6b0\uc2a4\ub97c \uc774\uc6a9\ud55c \uce74\uba54\ub77c \ud68c\uc804<br \/>\n<\/strong><\/span><span style=\"font-size: medium;\"><span style=\"font-size: medium;\">WPF\uc5d0\uc11c \ud2b8\ub799\ubcfc(Trackball) \uad6c\ud604\ud558\uae30<\/span><\/span>&nbsp;<\/p>\n<\/div>\n<\/div>\n<div style=\"text-align: right;\"><span style=\"font-size: medium;\"><span style=\"font-size: small;\"><strong>Daniel Lehenbauer<br \/>\n<\/strong><\/span><a href=\"http:\/\/blogs.msdn.com\/danlehen\"><span style=\"font-size: small;\"><strong>http:\/\/blogs.msdn.com\/danlehen<\/strong><\/span><\/a><\/span><\/div>\n<p><strong><br \/>\n\uac1c\uc694<\/strong><br \/>\n\ubcf4\ud1b5 3D \ubaa8\ub378\uc744 \ud654\uba74\uc5d0 \ud45c\uc2dc\ud558\uba74, \uadf8 \ub2e4\uc74c\uc73c\ub85c \ud560 \uc791\uc5c5\uc740 \ub9c8\uc6b0\uc2a4\ub85c \ubaa8\ub378\uc744 \ud68c\uc804\ud574 \ubcf4\ub294 \uac83\uc774\ub2e4. \ub9c8\uc6b0\uc2a4\ub97c \ud1b5\ud574 3D \uc624\ube0c\uc81d\ud2b8\ub97c \ud68c\uc804\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \uc77c\ubc18\uc801\uc778 \uae30\uc220\uc740 \ud2b8\ub799\ubcfc \uae30\ub2a5\uc774\ub77c\uace0 \uc54c\ub824\uc838 \uc788\ub2e4. \uc774 \uae00\uc740 \ud2b8\ub799\ubcfc\uc774\ub780 \ubb34\uc5c7\uc774\uba70, \uc774\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud55c \ubc29 \ubc95\uc744 \uc0b4\ud3b4\ubcf8\ub2e4. \uc774 \uae00\uc758 \ub9c8\uc9c0\ub9c9\uc5d0 \uc5b8\uae09\ud55c \ub9c1\ud06c\ub294 WPF \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ub9c8\uc6b0\uc2a4\ub97c \uc774\uc6a9\ud558\uc5ec \uce74\uba54\ub77c\ub97c \ud68c\uc804\ud560 \uc218 \uc788\ub294 \uc0d8\ud50c \ucf54\ub4dc\uc774\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1310933327.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"289\" height=\"216\" \/><\/p>\n<div>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub9bc1a) \uae30\ubcf8 \uad6c\uc131\uc744 \uac00\uc9c0\ub294 \ud638\ub791\uc774 \ubaa8\ub378<\/p>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1137804107.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"287\" height=\"214\" \/><\/p>\n<div style=\"text-align: center;\">\uadf8\ub9bc1b) \ub9c8\uc6b0\uc2a4\ub97c \ub20c\ub7ec \uc67c\ucabd \uc544\ub798\ub85c \uc870\uae08 \ub4dc\ub798\uadf8\ud558\uc5ec \ud68c\uc804\ub41c \ud638\ub791\uc774 \ubaa8\ub378<\/div>\n<\/div>\n<p><span style=\"font-size: medium;\"><strong><br \/>\n1. \uc18c\uac1c<\/strong><\/span><br \/>\n\ud2b8\ub799\ubcfc\uc740 \ub9c8\uc6b0\uc2a4\uc758 \uc774\ub3d9\uc744 3D \ud68c\uc804\uc73c\ub85c \ubcc0\ud658\ud55c \uac83\uc774\ub2e4. \uc774\ub294 \ub9c8\uc6b0\uc2a4\uc758 \uc704\uce58\ub97c \uadf8\ub9bc2\uc5d0\uc11c \ubcf4\uc5ec\uc9c0\ub294 \uac83\ucc98\ub7fc Viewport3D \uc804\uba74\uc5d0 \uc874\uc7ac\ud558\ub294 \uac00\uc0c1\uc758 \uad6c\uba74\uc73c\ub85c \ub9c8\uc6b0\uc2a4\uc758 \uc704\uce58\ub97c \ud22c\uc601\ud55c \uac83\uc774\ub2e4. \ub9c8\uc6b0\uc2a4\ub97c \uc6c0\uc9c1\uc784\uc73c\ub85c\uc368 \uce74\uba54\ub77c(\ub610\ub294 \uc7a5\uba74)\uc740 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \uc544\ub798\uc758 \uad6c\uba74 \uc704\uc758 \ub3d9\uc77c\ud55c \uc704\uce58\ub97c \uc720\uc9c0\ud558\uba74\uc11c \ud68c\uc804\ub41c\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1371070015.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"193\" height=\"235\" \/><\/p>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub7fc2a) \uc815\uc721\uba74\uccb4 \ubaa8\ub378\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Viewport3D\uc640 \uc0ac\uc6a9\uc790 \uc2dc\uc810\uc5d0\uc11c \ubcf8 \ud2b8\ub799\ubcfc<\/p>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1041673730.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"266\" height=\"293\" \/><\/p>\n<div style=\"text-align: center;\">\uadf8\ub9bc2b) \ub9c8\uc6b0\uc2a4 \uc704\uce58\uac00 \ub9f5\ud551\ub41c \uad6c\uba74 \uc0c1\uc758 \uc704\uce58\ub97c \uc124\uba85\ud558\uae30 \uc704\ud55c \uce21\uba74\uc5d0\uc11c \ubcf8 \uadf8\ub9bc<\/div>\n<p>\ub9c8\uc6b0\uc2a4\uac00 \uc218\ud3c9\uc73c\ub85c \uc774\ub3d9\ub420 \ub54c, Y \ucd95\uc5d0 \ub300\ud55c \ud68c\uc804\uc740 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \uc544\ub798\uc5d0 \ub3d9\uc77c\ud55c \uc704\uce58\uac00 \uc720\uc9c0\ub418\uc5b4\uc57c\ud55c\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1335266356.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"313\" height=\"266\" \/><\/p>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub9bc3) \uc218\ud3c9\uc73c\ub85c \ub9c8\uc6b0\uc2a4\ub97c \uc6c0\uc9c1\uc774\ub294 \uac83\uc740 Y\ucd95\uc5d0 \ub300\ud574 \uc7a5\uba74\uc744 \ud68c\uc804\uc2dc\ud0a8\ub2e4.<\/p>\n<\/div>\n<p>\uc774\uc640 \uc720\uc0ac\ud558\uac8c \ub9c8\uc6b0\uc2a4 \uc704\uce58\ub97c \uc218\uc9c1\uc73c\ub85c \ubcc0\uacbd\uc2dc\ud0a4\ub294 \uac83\uc740 X \ucd95\uc5d0 \ub300\ud55c \ud68c\uc804\uc744 \ubc1c\uc0dd\uc2dc\ud0a8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1074061598.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"339\" height=\"325\" \/><\/p>\n<div>\n<div style=\"text-align: center;\">\uadf8\ub9bc4) \ub9c8\uc6b0\uc2a4\ub97c \uc218\uc9c1\uc73c\ub85c \uc6c0\uc9c1\uc774\ub294 \uac83\uc740 X \ucd95\uc5d0 \ub300\ud574 \uc7a5\uba74\uc744 \ud68c\uc804\uc2dc\ud0a4\ub294 \uac83\uc774\ub2e4.<\/div>\n<p>\uc774\ub7ec\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub294 X\uc640 Y\ucd95\uc5d0 \ub300\ud55c \ud68c\uc804\uc758 \uc870\ud569\uc744 \uc801\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uac00 \uc6d0\ud558\ub294 \ubc29\ud5a5\uc5d0\uc11c \ubaa8\ub378\uc744 \uc0b4\ud3b4\ubcfc \uc218 \uc788\ub294 \ub9e4\uc6b0 \uc9c1\uad00\uc801\uc778 \ubc29\ubc95\uc774\ub2e4.<\/p>\n<div>\n<p><span style=\"font-size: medium;\"><strong>2. \ud68c\uc804 \uacc4\uc0b0<br \/>\n<\/strong><\/span>\uac01\uac01 \ub9c8\uc6b0\uc2a4 \uc774\ub3d9 \uc774\ubca4\ud2b8\uc5d0\uc11c \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \uc544\ub798\uc758 \ub3d9\uc77c\ud55c \uc704\uce58\ub97c \uc720\uc9c0\ud558\ub294 \ud68c\uc804\uc744 \uacc4\uc0b0\ud560 \ud544\uc694\uac00 \uc788\uc73c\uba70 \uc774\ub97c \uc218\ud589\ud558\uae30 \uc704\ud55c 2\uac00\uc9c0 \ub2e8\uacc4\uac00 \ud544\uc694\ud558\ub2e4. \uccab\ubc88\uc9f8\ub294 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130\uac00 \uad6c\uba74\uc758 \uc5b4\ub290 \uc704\uce58\uc5d0 \uc788\ub294\uc9c0 \uacc4\uc0b0\ud558\ub294 \uac83\uc774\ub2e4. \ub450\ubc88\uc9f8\ub294 \uc608\uc804 \uc704\uce58\ub97c \uc0c8\ub85c\uc6b4 \uc704\uce58\ub85c \ubcc0\ud658\ud558\uae30 \uc704\ud574 \ud544\uc694\ud55c \ud68c\uc804\uc744 \uacc4\uc0b0\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<div style=\"text-align: center;\">\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1159986209.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"199\" height=\"206\" \/>\uadf8\ub9bc5a) \ub9c8\uc6b0\uc2a4 \uc704\uce58\ub294 \uc88c\uc0c1\ub2e8\uc5d0 (0,0)\uc744 \uac00\uc9c0\ub294 UIElement\uc758 \uc88c\ud45c\uacf5\uac04 \uc0c1\uc5d0\uc11c \uc54c \uc218 \uc788\ub2e4.<\/p>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1201581482.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"190\" height=\"190\" \/><\/p>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub9bc5b) 2\ucc28\uc6d0 \ub9c8\uc6b0\uc2a4 \uc704\uce58\ub97c Viewport3D\uc758 \uad6c\uba74 \uc0c1\uc758 \uc704\uce58\ub85c \ud22c\uc601\ud558\uba70 \uc774 \uc704\uce58\ub294 3\ucc28\uc6d0\uc774\ub2e4.<\/p>\n<div style=\"text-align: left;\">\n<div>\n<div>\n<div style=\"text-align: center;\">\n<div style=\"text-align: left;\">\n<div>\n<div>\n<div style=\"text-align: left;\">\n<div style=\"text-align: left;\">\n<div>\n<div>\uc6b0\ub9ac\ub294 \ud68c\uc804\uc744 \uacc4\uc0b0\ud558\ub294 \uac83\ub9cc\uc744 \uc0dd\uac01\ud560 \uac83\uc774\ubbc0\ub85c \uc6b0\ub9ac\uc5d0\uac8c \uac00\uc7a5 \ud3b8\ub9ac\ud55c \uad6c\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4. \ubc18\uc9c0\ub984\uc774 1\uc774\uba70 \uc911\uc2ec\uc774 (0,0,0)\uc778 \uad6c\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \uac04\ub2e8\ud558\ub2e4. \uadf8\ub9bc6\uc5d0\uc11c \ubcf4\ub294 \uac83\ucc98\ub7fc \ub450\uac1c\uc758 2D \uc88c\ud45c\uacc4 \uc0ac\uc774\uc758 \ubcc0\ud658\uc758 \uc608\uc5d0\uc11c X, Y \uc694\uc18c\ub97c \ucc3e\ub294\ub2e4.<\/div>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1115953529.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"223\" height=\"219\" \/><\/p>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub9bc6a) UIElement\uc758 \uc88c\ud45c\uacc4<\/p>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1088809078.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"211\" height=\"217\" \/><\/p>\n<div style=\"text-align: center;\">\n<p>\uadf8\ub9bc6b) \uc6b0\ub9ac\uac00 \uc815\ud55c \ud2b8\ub799\ubcfc\uc758 \uc88c\ud45c\uacc4<\/p>\n<\/div>\n<p>\uc774\ub97c \uc218\ud589\ud558\uae30 \uc704\ud574 Viewport3D\uc758 \uacbd\uacc4\ub97c [0,0]-[2,2] \ubc94\uc704\ub85c \ub9f5\ud551\ub418\ub3c4\ub85d \ud06c\uae30 \ubcc0\ud658\uc744 \ud55c\ub2e4. \ub2e4\uc74c\uc73c\ub85c \uc88c\uc0c1\ub2e8 \ucf54\ub108\uc5d0\uc11c \uc911\uc2ec \uc704\uce58\ub97c \uc6d0\uc810\uc73c\ub85c \uc6c0\uc9c1\uc774\ub3c4\ub85d \ubcc0\ud658\ud55c\ub2e4. \uc704\uce58\ub97c \ubc94\uc704 [-1,1]-[1,-1]\ub85c \ub193\ub294\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c 2D \uc88c\ud45c\uacc4\uc5d0\uc11c Y\ucd95\uc774 \uc704 \ubc29\ud5a5 \ub300\uc2e0 \uc544\ub798\ubc29\ud5a5\uc73c\ub85c \ud5a5\ud558\ub3c4\ub85d \ud55c\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1123800266.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"95\" height=\"91\" \/><\/p>\n<pre>\/\/ \ubc94\uc704\uac00 0,0] -[2,2]\uac00 \ub418\ub3c4\ub85d \ud06c\uae30 \ubcc0\ud658\r\ndouble x = p.x \/ (width \/ 2);\r\ndouble y = p.y \/ (height \/ 2);\r\n\r\n\/\/ 0,0\uc744 \uc911\uc2ec\uc73c\ub85c \uc774\ub3d9\r\nx = x - 1;\r\n\r\n\/\/ Y\ucd95\uc774 \uc544\ub798 \ubc29\ud5a5 \ub300\uc2e0 \uc704\ubc29\ud5a5\uc774 \ub418\ub3c4\ub85d \ubc18\uc804\r\ny = 1 - y;<\/pre>\n<p>\uc774\uc81c z\uac12\uc744 \uac00\uc9c4 x\uc640 y \uc704\uce58\uc5d0 \ub300\ud55c \uad6c\uba74 \uc0c1\uc758 \uc704\uce58\ub97c \uc54c\uc218 \uc788\uac8c \ub418\uc5c8\ub2e4. \uad6c\uc758 \ubc18\uc9c0\ub984\uc774 1\uc774\ubbc0\ub85c z\ub294 \ub2e4\uc74c\uc758 \uacf5\uc2dd\uc73c\ub85c \uad6c\ud560 \uc218 \uc788\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1365261874.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"111\" height=\"53\" \/><\/p>\n<pre>double z2 = 1 - x*x - y*y;\r\ndouble z = z2 &gt; 0 ? Math.Sqrt(z2) : 0;\r\n\r\nVector3D p = new Vector3D(x, y, z);\r\np.Normalize();<\/pre>\n<p>\uc774\uc81c \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \uc544\ub798\uc758 \uad6c\uba74 \uc0c1\uc758 \uc704\uce58 (x, y, z)\ub97c \uc54c\uac8c \ub418\uc5c8\ub2e4.<\/p>\n<p><span style=\"font-size: medium;\"><strong>2.2 \ud3ec\uc778\ud2b8 \uac04\uc758 \ud68c\uc804<br \/>\n<\/strong><\/span>\uc6b0\ub9ac\ub294 \ub9c8\uc6b0\uc2a4 \uc774\ub3d9\uc2dc\uc5d0 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud2b8 \uc544\ub798\uc5d0 \ub300\ud55c \uad6c\uba74 \uc0c1\uc758 \ub3d9\uc77c\ud55c \uc704\uce58\ub97c \uc720\uc9c0\ud558\ub294 \ubaa8\ub378\uc758 \ud68c\uc804\uc744\u00a0 \uc6d0\ud55c\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ud638\ucd9c\ub41c \ub9c8\uc6b0\uc2a4 \uc774\ub3d9 \uc774\ubca4\ud2b8\uc5d0\uc11c \uad6c\uba74\uc0c1\uc758 \uc774\uc804 \uc704\uce58\ub97c \uae30\uc5b5\ud558\uace0 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \uc544\ub798\uc758 \ud604\uc7ac \uc704\uce58\ub85c \ubcc0\ud658\ub420 \ud68c\uc804\uc744 \ub9cc\ub4e4\uc5b4 \uc774\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\uc774 \ud68c\uc804\uc744 \uacc4\uc0b0\ud558\uae30 \uc704\ud574 2\uac00\uc9c0\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n<ol>\n<li>\ud68c\uc804 \ucd95<\/li>\n<li>\ud68c\uc804 \uac01\ub3c4<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1000274456.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"191\" height=\"190\" \/><\/p>\n<div style=\"text-align: center;\">\uadf8\ub9bc7)\u00a0 v1\uc5d0\uc11c v2\ub85c \ubcc0\ud658\ub420 \uac01\ub3c4\uc640 \ud68c\uc804\ucd95\uc744 \uacc4\uc0b0\ud560 \ud544\uc694\uac00 \uc788\ub2e4.<\/div>\n<p>\uad6c\uac00 \uc6d0\uc810\uc744 \uc911\uc2ec\uc73c\ub85c \ud558\uace0 \uc788\uc73c\ubbc0\ub85c \uc704\uce58\ub97c \ubc31\ud130\ub85c \ud574\uc11d\ud560 \uc218 \uc788\ub2e4. \ud68c\uc804 \ucd95\uacfc \ud68c\uc804 \uac01\ub3c4\ub294 \uac01\uac01 \ubc31\ud130\uc758 \ub0b4\uc801\uacfc \uc678\uc801\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc27d\uac8c \uad6c\ud560 \uc218 \uc788\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1370029399.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"137\" height=\"77\" \/><\/p>\n<pre>Vector3D axis = Vector3D.CrossProduct(v1, v2);\r\ndouble theta = Vector3D.AngleBetween(v1, v2);<\/pre>\n<p>\uc77c\ub2e8 \ucd95\uacfc \ud68c\uc804 \uac01\ub3c4 \ubaa8\ub450\ub97c \uc54c\uac8c \ub418\uc5c8\ub2e4\uba74 \ub0a8\uc740 \uac83\uc740 \uc0c8\ub85c\uc6b4 \ud68c\uc804\uc744 \ud604\uc7ac \ubc29\ud5a5\uc5d0 \uc801\uc6a9\ud558\ub294 \uac83\uc774\ub2e4:<\/p>\n<pre>\/\/ \uac01\ub3c4\uc5d0 \uc74c\uc218\ub97c \ucde8\ud558\ub294\ub370, \uc774\ub294 \uce74\uba54\ub77c\ub97c \ud68c\uc804\ud558\uae30 \ub54c\ubb38\uc774\ub2e4.\r\n\/\/ \uc7a5\uba74\uc744 \ub300\uc2e0 \ud68c\uc804\ud55c\ub2e4\uba74 \uc774\ub807\uac8c \ud574\uc11c\ub294 \uc54a\ub41c\ub2e4.\r\nQuaternion delta = new Quaternion(axis, -angle);\r\n\r\n\/\/ RotateTransform3D\ub85c\ubd80\ud130 \ud604\uc7ac\uc758 \ubc29\ud5a5\uc744 \uc5bb\ub294\ub2e4.\r\nRotateTransform3D rt = (RotateTransform3D)camera.Transform;\r\nAxisAngleRotation r = (AxisAngleRotation3D)rt.Rotation;\r\nQuaternion q = new Quaternion(r.Axis, r.Angle);\r\n\r\n\/\/ \uc774\uc804 \ubc29\ud5a5\uacfc delta\ub97c \ud569\uc131\ud55c\ub2e4.\r\nq *= delta;\r\n\r\n\/\/ \uc0c8\ub85c\uc6b4 \ubc29\ud5a5\uc744 Rotation3D\uc5d0 \ub2e4\uc2dc \uc9c0\uc815\ud55c\ub2e4.\r\nr.Axis = q.Axis;\r\nr.Angle = q.Angle;<\/pre>\n<p><strong><span style=\"font-size: medium;\">3. \uae30\ud0c0 \uc138\ubd80\uc0ac\ud56d<br \/>\n<\/span><\/strong>2\uc808\uc5d0\uc11c \uac04\uacfc\ud55c \uba87\uac00\uc9c0 \uc138\ubd80\uc0ac\ud56d\uc774 \uc788\ub2e4. \uccab\ubc88\uc9f8\ub294 Viewport3D\uac00 \uc815\uc0ac\uac01\ud615\uc774\ub77c\ub294 \uac00\uc815\ud558\uace0 \uad6c\uba74 \uc0c1\uc5d0 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130\uc758 \ud22c\uc601\uc744 \uacc4\uc0b0\ud588\ub2e4\ub294 \uac83\uc774\ub2e4. \ub9cc\uc57d Viewport3D\uac00 \uc815\uc0ac\uac01\ud615\uc774 \uc544\ub2c8\ub77c\uba74 \ud2b8\ub799\ubcfc\uc740 \uc2e4\uc81c\ub85c \ud0c0\uc6d0\uccb4\uc758 \ubaa8\uc2b5\uc77c \uac83\uc774\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1394339512.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"211\" height=\"143\" \/><\/p>\n<div style=\"text-align: center;\">\uadf8\ub9bc8) \ub9cc\uc57d Viewport3D\uac00 \uc815\uc0ac\uac01\ud615\uc774 \uc544\ub2c8\ub77c\uba74 \ud2b8\ub799\ubcfc\uc740 \uc2e4\uc81c\ub85c \ud0c0\uc6d0\uccb4 \ubaa8\uc591\uc77c \uac83\uc774\ub2e4.<\/div>\n<p>\uc774\ub7ec\ud55c \ud6a8\uacfc\ub294 \uc2e4\uc81c\ub85c \uc8fc\ubaa9\ud560 \ub9cc\ud55c \uc0ac\uc2e4\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc815\uc0ac\uac01\ud615\uc774 \uc544\ub2cc \uc0ac\uac01\ud615\uc758 \ub108\ube44\uc640 \ub192\uc774\uc5d0 \ub300\ud55c \ube44\uc728\uc774 \ud06c\ub2e4\uba74 \uc9e7\uc740 \ucd95\uc744 \ub530\ub77c \ub354 \ube60\ub974\uac8c \ud68c\uc804\ud558\ub294 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \uc774\ub7ec\ud55c \ud604\uc0c1\uc744 \ub9c9\uace0\uc790 \ud55c\ub2e4\uba74 2D \ud3ec\uc778\ud2b8\ub97c (width, height) \uad6c \ub300\uc2e0\uc5d0 \uac00\ub85c\uc640 \uc138\ub85c\uc758 \uae38\uc774\uac00 \ub3d9\uc77c\ud55c \uad6c\ub85c \ub9f5\ud551\ud558\uba74 \ub41c\ub2e4. \ud55c\uac00\uc9c0 \uc88b\uc740 \uc608\ub294 \uac00\ub85c\uc640 \uc138\ub85c \uae38\uc774\ub97c \ubaa8\ub450 min(width, height)\uc774\ub2e4.<\/p>\n<p>\ub610 \ub2e4\ub978 \uc774\uc288\ub294 \ud2b8\ub799\ubcfc \uc0c1\uc758 \uc704\uce58\uc5d0 \ub9f5\ud551\ub418\uc9c0 \uc54a\ub294 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130\uac00 \ubc1c\uc0dd\ud560 \uacbd\uc6b0\uc5d0 \ub300\ud55c \ucc98\ub9ac\uc774\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1340306123.png\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"190\" height=\"190\" \/><\/p>\n<div style=\"text-align: center;\">\uadf8\ub9bc9) \ud68c\uc0c9 \uc9c0\uc5ed\uc740 \ud2b8\ub799\ubcfc \uc0c1\uc758 \uc704\uce58\ub85c \ub9f5\ud551\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/div>\n<p>\ud55c\uac00\uc9c0 \ud574\uacb0\ubc95\uc740 \uc774\ub7f0 \uacbd\uc6b0\uc5d0 z\ub97c 0\uc73c\ub85c \ud55c\uc815\ud558\ub294 \uac83\uc73c\ub85c 2.1\uc808\uc758 \ub05d\uc5d0\uc11c \ubcf4\uc600\ub2e4:<\/p>\n<pre>double z = z2 &gt; 0 ? Math.Sqrt(z2):0;<\/pre>\n<p>\uae30\uc220\uc801\uc73c\ub85c x\uc640 y\ub97c \uc815\uaddc\ud654\ud574\uc57c \ud558\ub294\ub370, \uc774\ub294 Z=0\uc778 \ud3c9\uba74\uc5d0\uc11c \ud2b8\ub799\ubcfc \uc0c1\uc5d0 \uac00\uc7a5 \uac00\uae4c\uc6b4 \uc704\uce58\ub97c \ucc3e\uae30 \uc704\ud568\uc774\ub2e4. \uc815\uaddc\ud654\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ubc18\ud658\ub41c \uc704\uce58\ub294 \uad6c\uba74\uc0c1\uc5d0 \uc788\uc9c0 \uc54a\uac8c \ub41c\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1160260604.gif\" alt=\"\uc0ac\uc6a9\uc790 \uc0bd\uc785 \uc774\ubbf8\uc9c0\" width=\"95\" height=\"101\" \/><br \/>\n\uadf8\ub7ec\ub098, 2.2\uc808\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc815\uaddc\ud654\ub41c \ubca1\ud130\uc5d0 \ud574\ub2f9\ud558\ub294 Vector3D.AngleBetween(v1, v2)\ub97c \uc0ac\uc6a9\ud588\ub2e4. \uc774\ub294 \uc704\uc5d0\uc11c \ucc98\ub7fc \uc815\uaddc\ud654\ub41c x\uc640 y\uc640 \ub3d9\uc77c\ud55c \uacb0\uacfc\uc774\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\ub294 \ub610\ud55c \ubaa8\ub378\uacfc \uce74\uba54\ub77c\uc758 \ucd08\uae30 \uc704\uce58\uc5d0 \ub300\ud574 \uc774\uc57c\uae30 \ud558\uc9c0 \uc54a\uc558\ub2e4. \uc774 \uad6c\ud604\uc740 \ubaa8\ub378\uc774 \uc6d0\uc810\uc5d0 \uc874\uc7ac\ud558\uba70 \uce74\uba54\ub77c\ub294 \uc6d0\uc810\uc744 \ubcf4\uace0 \uc788\uace0 \ubaa8\ub378\uc774 \ubcf4\uc774\ub294 \uc704\uce58\uc5d0 \ub193\uc5ec\uc84c\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc774 \uae00\uc740 \ud655\ub300\/\ucd95\uc18c\uc5d0 \ub300\ud574 \uc5b8\uae09\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uc0d8\ud50c \ucf54\ub4dc\uc5d0\uc11c \uc774\uc5d0 \ub300\ud55c \uad6c\ud604\uc744 \ud3ec\ud568\ud558\uace0 \uc788\uc73c\ubbc0\ub85c \uc0b4\ud3b4\ubcf4\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p><span style=\"font-size: medium;\"><strong>4. \uc0d8\ud50c \ucf54\ub4dc<br \/>\n<\/strong><\/span>\uc0d8\ud50c \ucf54\ub4dc\ub294 \uc7ac\uc0ac\uc6a9\uc774 \uac00\ub2a5\ud55c 3\uac1c \ud30c\uc77c\ub85c \uad6c\uc131\ub41c\ub2e4.<\/p>\n<p>Trackball.cs : \uc720\ud2f8\ub9ac\ud2f0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc774\uba70 FrameworkElement\uc5d0 \ub300\ud55c \ub9c8\uc6b0\uc2a4 \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud55c\ub2e4. \ub610\ud55c \uacb0\uacfc\ub85c\uc368 \ud68c\uc804\uacfc \ud06c\uae30\ubcc0\ud658\uc744 \uac00\uc9c0\ub294 Transform3D\ub97c \uc5c5\ub370\uc774\ud2b8 \ud55c\ub2e4.<\/p>\n<p>Trackport.proj : loose.xaml \ub85c\ubd80\ud130 Model3D\uc744 \uc77d\uace0 \ud45c\uc2dc\ud558\ub294 UserControl\uc774\uba70 \ud2b8\ub799\ubcfc \uae30\ub2a5(Trackball.cs)\uc774 \uc801\uc6a9\ub418\uc5c8\ub2e4.<\/p>\n<p>ModelViewer.proj : \uadf8\ub9bc 1\uc758 \ubaa8\ub378 \ubdf0\uc5b4 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158(Trackport.proj\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608)<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/1\/1124065036.zip\"><img decoding=\"async\" src=\"\/images\/download.svg\" width=\"64\" \/><\/a><\/p>\n<p><span style=\"font-size: medium;\"><strong>\uac10\uc0ac\uc758 \ub9d0<br \/>\n<\/strong><\/span>\ubaa8\ub378 \ubdf0 \uc0d8\ud50c\uc744 \uc81c\uacf5\ud574\uc900 \ub098\uc758 \uc544\ub0b4, Bonnie\uc5d0\uac8c \uac10\uc0ac\ud55c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ub9c8\uc6b0\uc2a4\ub97c \uc774\uc6a9\ud55c \uce74\uba54\ub77c \ud68c\uc804 WPF\uc5d0\uc11c \ud2b8\ub799\ubcfc(Trackball) \uad6c\ud604\ud558\uae30&nbsp; Daniel Lehenbauer http:\/\/blogs.msdn.com\/danlehen \uac1c\uc694 \ubcf4\ud1b5 3D \ubaa8\ub378\uc744 \ud654\uba74\uc5d0 \ud45c\uc2dc\ud558\uba74, \uadf8 \ub2e4\uc74c\uc73c\ub85c \ud560 \uc791\uc5c5\uc740 \ub9c8\uc6b0\uc2a4\ub85c \ubaa8\ub378\uc744 \ud68c\uc804\ud574 \ubcf4\ub294 \uac83\uc774\ub2e4. \ub9c8\uc6b0\uc2a4\ub97c \ud1b5\ud574 3D \uc624\ube0c\uc81d\ud2b8\ub97c \ud68c\uc804\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \uc77c\ubc18\uc801\uc778 \uae30\uc220\uc740 \ud2b8\ub799\ubcfc \uae30\ub2a5\uc774\ub77c\uace0 \uc54c\ub824\uc838 \uc788\ub2e4. \uc774 \uae00\uc740 \ud2b8\ub799\ubcfc\uc774\ub780 \ubb34\uc5c7\uc774\uba70, \uc774\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud55c \ubc29 \ubc95\uc744 \uc0b4\ud3b4\ubcf8\ub2e4. \uc774 \uae00\uc758 \ub9c8\uc9c0\ub9c9\uc5d0 \uc5b8\uae09\ud55c \ub9c1\ud06c\ub294 WPF \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=1034\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;WPF\uc5d0\uc11c \ud2b8\ub799\ubcfc \uae30\ub2a5 \uad6c\ud604&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[21],"class_list":["post-1034","post","type-post","status-publish","format-standard","hentry","category-wpf","tag-wpf"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1034","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1034"}],"version-history":[{"count":2,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1034\/revisions"}],"predecessor-version":[{"id":3397,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1034\/revisions\/3397"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1034"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}