<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2200661281887379041</id><updated>2012-05-14T08:36:18.388-07:00</updated><category term='Director'/><category term='Flash'/><category term='IOS'/><category term='VC++'/><category term='Away3D'/><category term='3DMax'/><category term='Android'/><category term='PV3D'/><category term='Flash 3D'/><title type='text'>Max の 3D Studio</title><subtitle type='html'>知之者不如好之者,好之者不如樂之者</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/posts/full'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/full'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/full?start-index=26&amp;max-results=25'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>93</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-8327810521778263805</id><published>2012-05-14T08:36:00.000-07:00</published><updated>2012-05-14T08:36:18.396-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Away3D'/><title type='text'>【教學】Away3D 運用MD2模型</title><content type='html'>透過Away3D 4.0 可以很容易的使用MD2模型格式，&lt;br /&gt;此範例可以使用滑鼠移動camera來觀察模型，&lt;br /&gt;鍵盤數字1至5鍵可以切換不同動作。 &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-qngapkkoh6Q/T7El1AHRwyI/AAAAAAAAAfc/zjRoioWwm1I/s1600/demo.jpg" imageanchor="1"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/-qngapkkoh6Q/T7El1AHRwyI/AAAAAAAAAfc/zjRoioWwm1I/s400/demo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://igmax.myweb.hinet.net/Away3D_LoadMd2/bin/index.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-8327810521778263805?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/8327810521778263805/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2012/05/away3d-md2.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8327810521778263805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8327810521778263805'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2012/05/away3d-md2.html' title='【教學】Away3D 運用MD2模型'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qngapkkoh6Q/T7El1AHRwyI/AAAAAAAAAfc/zjRoioWwm1I/s72-c/demo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-4907385306754231368</id><published>2012-05-03T08:02:00.000-07:00</published><updated>2012-05-03T09:06:03.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IOS'/><title type='text'>【教學】IOS 建立OpenGL ES 2.0 3D基本環境</title><content type='html'>&lt;b&gt;IOS 建立3D基本環境步驟:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;1.新開一個專案&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;雖然有"OpenGL ES Application"這個現成框架，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;但此範例是使用手動自行創建3D基本環境，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;較預設的OpenGL ES的 3D框架精簡許多，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;所以這裡選擇"window-based Application"，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;再手動增加3D環境。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-kPIJLuRjlQE/T6KYD_0GnUI/AAAAAAAAAek/tp-xIJZp7UA/s1600/demo_0.png" imageanchor="1"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/-kPIJLuRjlQE/T6KYD_0GnUI/AAAAAAAAAek/tp-xIJZp7UA/s400/demo_0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2.增加Frameworks連結&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OpenGLES.framework&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QuartzCore.framework&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-UTsMyDQGd5o/T6KeVq01s5I/AAAAAAAAAe0/_lfuSG6GZfU/s1600/demo_1.png" imageanchor="1"&gt;&lt;img border="0" height="262" src="http://4.bp.blogspot.com/-UTsMyDQGd5o/T6KeVq01s5I/AAAAAAAAAe0/_lfuSG6GZfU/s400/demo_1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3.手動增加一個自訂的UIView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLView.h&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLView.m&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-WLNvQyA-Grc/T6Ke18y8mJI/AAAAAAAAAfA/V3l6rODuC4Q/s1600/demo_2.png" imageanchor="1"&gt;&lt;img border="0" height="291" src="http://4.bp.blogspot.com/-WLNvQyA-Grc/T6Ke18y8mJI/AAAAAAAAAfA/V3l6rODuC4Q/s400/demo_2.png" width="259" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.基本的三維環境寫在這個OPGLView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLView.h&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#import &amp;lt;uikit/uikit.h&amp;gt;&lt;br /&gt;#import &amp;lt;QuartzCore/QuartzCore.h&amp;gt; &lt;br /&gt;#import &amp;lt;OpenGLES/ES2/gl.h&amp;gt;&lt;br /&gt;#import &amp;lt;OpenGLES/ES2/glext.h&amp;gt;&lt;br /&gt;&lt;br /&gt;@interface OPGLView:UIView&lt;br /&gt;{&lt;br /&gt;    GLuint viewRenderBuffer;&lt;br /&gt;    GLuint viewFrameBuffer;&lt;br /&gt;&lt;br /&gt;    CAEAGLLayer *eaglLayer;&lt;br /&gt;    EAGLContext *context;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLView.m&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#import "OPGLView.h"&lt;br /&gt;&lt;br /&gt;@implementation OPGLView&lt;br /&gt;&lt;br /&gt;+(Class)layerClass&lt;br /&gt;{&lt;br /&gt;    return [CAEAGLLayer class];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)setuplayer&lt;br /&gt;{&lt;br /&gt;    eaglLayer = (CAEAGLLayer *) self.layer;&lt;br /&gt;    eaglLayer.opaque = YES;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)setupContext&lt;br /&gt;{&lt;br /&gt;    EAGLRenderingAPI eaglAPI = kEAGLRenderingAPIOpenGLES2;&lt;br /&gt;    context = [[EAGLContext alloc] initWithAPI:eaglAPI];&lt;br /&gt;    if(!context)&lt;br /&gt;    {&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    if(![EAGLContext setCurrentContext:context])&lt;br /&gt;    {&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)setupRenderBuffer&lt;br /&gt;{&lt;br /&gt;    glGenRenderbuffers(1,&amp;amp;viewRenderBuffer);&lt;br /&gt;    glBindRenderbuffer(GL_RENDERBUFFER, viewRenderBuffer);&lt;br /&gt;    [context renderbufferStorage:GL_RENDERBUFFER fromFrawable:eaglLayer];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)setupFrameBuffer&lt;br /&gt;{&lt;br /&gt;    glGenFramebuffers(1,&amp;amp;viewFrameBuffer);&lt;br /&gt;    glBindFramebuffer(GL_FRAMEBUFFER, viewFrameBuffer);&lt;br /&gt;    glFramebufferRenderbuffer(GL_FRAMEBUFFER, &lt;br /&gt;                              GL_COLOR_ATTACHMENT0,&lt;br /&gt;                              GL_RENDERBUFFER,&lt;br /&gt;                              viewRenderBuffer);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)setupDisplayLink&lt;br /&gt;{&lt;br /&gt;    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self&lt;br /&gt;                                  selector:@selector(render:)];&lt;br /&gt;    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] &lt;br /&gt;                               forMode:NSDefaultRunLoopMode];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)render:(CADisplayLink *)displayLink&lt;br /&gt;{&lt;br /&gt;    glClearColor( 100.0f/255.0f,&lt;br /&gt;                  100.0f/255.0f,&lt;br /&gt;                  100.0f/255.0f,&lt;br /&gt;                  1.0f);&lt;br /&gt;    glClear(GL_COLOR_BUFFER_BIT);&lt;br /&gt;&lt;br /&gt;    [context presentRenderbuffer:GL_RENDERBUFFER];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(id)initWithFrame:(CGRect)frame&lt;br /&gt;{&lt;br /&gt;    self = [super initWithFrame:frame];&lt;br /&gt;    if(self)&lt;br /&gt;    {&lt;br /&gt;        [self setupLayer];&lt;br /&gt;        [self setupContext];&lt;br /&gt;        [self setupRenderBuffer];&lt;br /&gt;        [self setupFrameBuffer];&lt;br /&gt;        [self setupDisplayLink];&lt;br /&gt;    }&lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)dealloc&lt;br /&gt;{&lt;br /&gt;   [context release];&lt;br /&gt;   context = nil;&lt;br /&gt;    &lt;br /&gt;   [super dealloc];&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;@end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5.將OPGLView加入OPGLSampleAppDelegate中&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLSampleAppDelegate.h&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#import "OPGLView.h"&lt;br /&gt;  &lt;br /&gt;@interface OPGLSampleAppDelegate:NSObject&lt;uiapplicationdelegate&gt;&lt;br /&gt;{&lt;br /&gt;    OPGLView *mOPGLView;&lt;br /&gt;}&lt;br /&gt;@property (nonatomic, retain) IBOutlet UIWindow *window;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPGLSampleAppDelegate.m&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;-(BOOL)application:(UIApplication *)application &lt;br /&gt;    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions&lt;br /&gt;{&lt;br /&gt;    CGRect screenBounds = [[UIScreen mainScreen] bounds];    &lt;br /&gt;    mOPGLView = [[[OPGLView alloc] initWithFrame:screenBounds] autorelease];&lt;br /&gt;    [self.window addSubview:mOPGLView];&lt;br /&gt;    &lt;br /&gt;    // Override point for customization after application launch.&lt;br /&gt;    [self.window makeKeyAndVisible];&lt;br /&gt;    return YES;&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-3QwBu-BivrE/T6KfHKD6IpI/AAAAAAAAAfM/yfggJEqg50o/s1600/demo_3.png" imageanchor="1"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-3QwBu-BivrE/T6KfHKD6IpI/AAAAAAAAAfM/yfggJEqg50o/s400/demo_3.png" width="203" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-4907385306754231368?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/4907385306754231368/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2012/05/ios-opengl-es-20-3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4907385306754231368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4907385306754231368'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2012/05/ios-opengl-es-20-3d.html' title='【教學】IOS 建立OpenGL ES 2.0 3D基本環境'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-kPIJLuRjlQE/T6KYD_0GnUI/AAAAAAAAAek/tp-xIJZp7UA/s72-c/demo_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-5803064546501590943</id><published>2012-04-28T09:51:00.000-07:00</published><updated>2012-05-03T08:26:23.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【教學】Flash3D (Proscenium) 運用SkyBox模擬720度全景(Panorama)效果</title><content type='html'>透過Proscenium這個3D Framework可以很容易的使用skybox，&lt;br /&gt;只須將(Panorama)全景圖區分為前後上下左右六張圖，&lt;br /&gt;指定給SceneSkyBox就行了。 &lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;package &lt;br /&gt;{&lt;br /&gt;    import com.adobe.scenegraph.BasicScene;&lt;br /&gt;    import com.adobe.scenegraph.SceneSkyBox;&lt;br /&gt;    import com.adobe.utils.LoadTracker;&lt;br /&gt;    import flash.display3D.Context3DRenderMode;&lt;br /&gt;    import flash.utils.Dictionary;&lt;br /&gt;    import flash.display.BitmapData;&lt;br /&gt;    import flash.geom.Vector3D;&lt;br /&gt; &lt;br /&gt;    /**&lt;br /&gt;     * Panorama Demo&lt;br /&gt;     * @author Max&lt;br /&gt;     */&lt;br /&gt;    public class Flash3D_Proscenium_SkyBox extends BasicScene &lt;br /&gt;    { &lt;br /&gt;        protected static const IMAGE_FILENAMES:Vector&lt;string&gt; = &lt;br /&gt;        new &lt;string&gt;["../res/images/right.png", &lt;br /&gt;                     "../res/images/left.png",&lt;br /&gt;                     "../res/images/top.png", &lt;br /&gt;                     "../res/images/bottom.png", &lt;br /&gt;                     "../res/images/front.png", &lt;br /&gt;                     "../res/images/back.png"];&lt;br /&gt;   &lt;br /&gt;        private var skybox:SceneSkyBox; &lt;br /&gt;        protected static const CAMERA_ORIGIN:Vector3D = new Vector3D( 0, 0, 20 );&lt;br /&gt;        protected static const ORIGIN:Vector3D = new Vector3D();&lt;br /&gt;  &lt;br /&gt;        public function Flash3D_Proscenium_SkyBox(renderMode:String = Context3DRenderMode.AUTO)&lt;br /&gt;        {&lt;br /&gt;            super(renderMode);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        override protected function initModels():void &lt;br /&gt;        {&lt;br /&gt;            super.initModels();&lt;br /&gt;            LoadTracker.loadImages(IMAGE_FILENAMES, imageLoadComplete);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        protected function imageLoadComplete(bitmaps:Dictionary):void&lt;br /&gt;        {&lt;br /&gt;            var i:uint;               &lt;br /&gt;            var bitmapDatas:Vector.&lt;bitmapdata&gt; = new Vector.&lt;bitmapdata&gt;(6, true);                 &lt;br /&gt;            for (i = 0; i &amp;lt; 6; i++)&lt;br /&gt;            {                       &lt;br /&gt;                bitmapDatas[i] = bitmaps[IMAGE_FILENAMES[i]].bitmapData;&lt;br /&gt;            }&lt;br /&gt;   &lt;br /&gt;            skybox = new SceneSkyBox(bitmapDatas, false);&lt;br /&gt;            scene.addChild(skybox);&lt;br /&gt;            skybox.name = "Sky";  &lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        override protected function resetCamera():void&lt;br /&gt;        {&lt;br /&gt;            _camera = scene.activeCamera;&lt;br /&gt;            _camera.identity();&lt;br /&gt;            _camera.position = CAMERA_ORIGIN;&lt;br /&gt;            _camera.appendRotation( -15, Vector3D.X_AXIS );&lt;br /&gt;            _camera.appendRotation( -25, Vector3D.Y_AXIS, ORIGIN );&lt;br /&gt;        } &lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;執行結果: &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-xtrhsAmA5M4/T5wlwvgK_CI/AAAAAAAAAeU/aKy7Qqdd3cw/s1600/demo_1.jpg" imageanchor="1"&gt;&lt;img border="0" height="272" src="http://3.bp.blogspot.com/-xtrhsAmA5M4/T5wlwvgK_CI/AAAAAAAAAeU/aKy7Qqdd3cw/s400/demo_1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_proscenium_skybox/Flash3D_Proscenium_SkyBox.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-5803064546501590943?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/5803064546501590943/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2012/04/flash3d-proscenium-skybox720panorama.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/5803064546501590943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/5803064546501590943'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2012/04/flash3d-proscenium-skybox720panorama.html' title='【教學】Flash3D (Proscenium) 運用SkyBox模擬720度全景(Panorama)效果'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-xtrhsAmA5M4/T5wlwvgK_CI/AAAAAAAAAeU/aKy7Qqdd3cw/s72-c/demo_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-3769964123657108100</id><published>2012-02-25T18:50:00.007-08:00</published><updated>2012-05-03T09:49:35.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【測試】使用FlashDevelop開發Flash3D (Proscenium)</title><content type='html'>Proscenium是Adobee官方自家推出的3D Framework，&lt;br /&gt;支持GPU加速，必須要在FlashPlayer 11上運行。&lt;br /&gt;目前官方已有許多範例，針對這些範例做了一些測試。&lt;br /&gt;&lt;br /&gt;我使用的開發工具是FlashDevelop，(官方是用FlashBuilder)。&lt;br /&gt;以下便是FlashDevelop開發Proscenium的步驟：&lt;br /&gt;Step1:&lt;br /&gt;(1) 下載安裝FlashDevelop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.flashdevelop.org/&lt;br /&gt;&lt;br /&gt;(2) 下載FlexSDK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4.5&lt;br /&gt;&lt;br /&gt;(3) 下載FlashPlayer11.1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.adobe.com/support/flashplayer/downloads.html&lt;br /&gt;&lt;br /&gt;(4) 下載PlayerGlobal.swc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.adobe.com/support/flashplayer/downloads.html&lt;br /&gt;&lt;br /&gt;(5) 下載proscenium_p1_100311.zip&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://labs.adobe.com/technologies/proscenium/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step2:&lt;br /&gt;(1) 將剛剛下載的Flex SDK解壓縮至指定路徑(自訂)&lt;br /&gt;&lt;br /&gt;(2) 將下載的playerglobal.swc檔放至Flex SDK目錄下的frameworks\libs\player\11.0內&lt;br /&gt;&lt;br /&gt;(3) 將下載的FlashPlayer檔放至FlashDevelop目錄下的Tools\flexsdk\runtimes\player\11.0內&lt;br /&gt;&lt;br /&gt;(4) 開啟FlashDevelop後，於上方選取Tools-&amp;gt;;ProgramSetting-&amp;gt;;AS3Context，找到"Installed Flex SDKs"項目，點擊右方按鈕添加我們的Flex SDK。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-5qEiSiGDmnY/T0meSChMT6I/AAAAAAAAAcs/T8H-NYIDTzA/s1600/demo_pic_01.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713271635047108514" src="http://4.bp.blogspot.com/-5qEiSiGDmnY/T0meSChMT6I/AAAAAAAAAcs/T8H-NYIDTzA/s400/demo_pic_01.jpg" style="cursor: hand; height: 269px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-tcd5o55aDpQ/T0mebLzNqYI/AAAAAAAAAc4/jhkXfd8m0QY/s1600/demo_pic_02.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713271792157436290" src="http://1.bp.blogspot.com/-tcd5o55aDpQ/T0mebLzNqYI/AAAAAAAAAc4/jhkXfd8m0QY/s400/demo_pic_02.jpg" style="cursor: hand; height: 276px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(5) 於上方選取Tools-&amp;gt;ProgramSetting-&amp;gt;FlashViewer，"external Player path"選取剛剛放到FlashDevelop目錄下的FlashPlayer。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-eGRs21JuCOA/T0meiKDPf0I/AAAAAAAAAdE/Uvs0LVhnbws/s1600/demo_pic_03.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713271911946878786" src="http://3.bp.blogspot.com/-eGRs21JuCOA/T0meiKDPf0I/AAAAAAAAAdE/Uvs0LVhnbws/s400/demo_pic_03.jpg" style="cursor: hand; height: 323px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step3:&lt;br /&gt;(1) 於FD上方選取Project-&amp;gt;new project-&amp;gt;AS3 Project，&lt;br /&gt;&lt;br /&gt;(2) 將proscenium_p1_100311.zip解壓縮至指定路徑(自訂)&lt;br /&gt;&lt;br /&gt;(3) 把proscenium解壓後的libs目錄內的Proscenium.swc跟Pellet.swc兩個檔，放到FD所開啟的AS3 Project專案目錄下的lib資料夾內。&lt;br /&gt;&lt;br /&gt;(4) 把proscenium解壓後的code\ProsceniumSamples下的src、res目錄都放到FD所開啟的AS3 Project專案目錄下。&lt;br /&gt;&lt;br /&gt;(5) 將lib中的兩個SWC添加到專案中（右鍵Add To Library）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-1dljocwJb64/T0merNfUAoI/AAAAAAAAAdQ/mlSnwu9ino0/s1600/demo_pic_04.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713272067488744066" src="http://4.bp.blogspot.com/-1dljocwJb64/T0merNfUAoI/AAAAAAAAAdQ/mlSnwu9ino0/s400/demo_pic_04.jpg" style="cursor: hand; height: 400px; width: 245px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(6) 在專案打開Properties視窗，將Output中的Platform中的FlashPlayer改成11.0&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-ov1CgCCI-Nw/T0mevV7rHGI/AAAAAAAAAdc/akwgd8b-ATc/s1600/demo_pic_05.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713272138474658914" src="http://4.bp.blogspot.com/-ov1CgCCI-Nw/T0mevV7rHGI/AAAAAAAAAdc/akwgd8b-ATc/s400/demo_pic_05.jpg" style="cursor: hand; height: 400px; width: 323px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(7) Properties視窗，將CompilerOptions中Additional Compiler Options加入-swf-version=13&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-MIIxAGPBcLI/T0me0A3MD2I/AAAAAAAAAdo/8vreZPYCBcE/s1600/demo_pic_06.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713272218718048098" src="http://4.bp.blogspot.com/-MIIxAGPBcLI/T0me0A3MD2I/AAAAAAAAAdo/8vreZPYCBcE/s400/demo_pic_06.jpg" style="cursor: hand; height: 400px; width: 371px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(8) 在src下逐個把.as文件set Document Class，然後按下Ctrl+Entere觀看結果；&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-TaRJQt6kLW8/T0me-D7eulI/AAAAAAAAAd0/haTMCY8BJ8c/s1600/demo_pic_10.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5713272391340046930" src="http://2.bp.blogspot.com/-TaRJQt6kLW8/T0me-D7eulI/AAAAAAAAAd0/haTMCY8BJ8c/s400/demo_pic_10.jpg" style="cursor: hand; height: 324px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_proscenium/flash3d_proscenium.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-3769964123657108100?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/3769964123657108100/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2012/02/flashdevelopflash3d-proscenium.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3769964123657108100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3769964123657108100'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2012/02/flashdevelopflash3d-proscenium.html' title='【測試】使用FlashDevelop開發Flash3D (Proscenium)'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5qEiSiGDmnY/T0meSChMT6I/AAAAAAAAAcs/T8H-NYIDTzA/s72-c/demo_pic_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-2697972146286139100</id><published>2011-03-11T10:49:00.001-08:00</published><updated>2011-05-05T07:28:38.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【測試】Flash3D API(Molehill)Jiglib物理引擎範例</title><content type='html'>此範例是參考Jiglib物理引擎改寫，&lt;br /&gt;方向鍵可以控制車輛移動，&lt;br /&gt;空白鍵停止。&lt;br /&gt;車輛的材質還有反光效果。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-jZRf7OMO9Rk/TXpu3tPiibI/AAAAAAAAAbk/atOM-dxFjB8/s1600/demo_pic1.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 312px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5582896591395785138" border="0" alt="" src="http://1.bp.blogspot.com/-jZRf7OMO9Rk/TXpu3tPiibI/AAAAAAAAAbk/atOM-dxFjB8/s400/demo_pic1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_jiglib_car/Away3D_Jiglib_Demo.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-2697972146286139100?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/2697972146286139100/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash3d-apimolehilljiglib.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/2697972146286139100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/2697972146286139100'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash3d-apimolehilljiglib.html' title='【測試】Flash3D API(Molehill)Jiglib物理引擎範例'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-jZRf7OMO9Rk/TXpu3tPiibI/AAAAAAAAAbk/atOM-dxFjB8/s72-c/demo_pic1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-459384885414252012</id><published>2011-03-10T03:50:00.000-08:00</published><updated>2011-05-05T07:29:02.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【測試】Flash3D API(Molehill) MD2模型範例</title><content type='html'>寫了一個簡單範例demo，&lt;br /&gt;現在Flash 3D API(Molehill)提供硬體支援，&lt;br /&gt;跑起來順暢多了，&lt;br /&gt;點擊滑鼠可以改變角色狀態。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-rGFYX_PgzZ4/TXi7TS_I1II/AAAAAAAAAbc/oTp7bzq6SiI/s1600/demo_pic.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 279px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5582417678314296450" border="0" alt="" src="http://4.bp.blogspot.com/-rGFYX_PgzZ4/TXi7TS_I1II/AAAAAAAAAbc/oTp7bzq6SiI/s400/demo_pic.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_md2_ani/Away3D_LoadMD2.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-459384885414252012?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/459384885414252012/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash3d-apimolehill-md2.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/459384885414252012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/459384885414252012'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash3d-apimolehill-md2.html' title='【測試】Flash3D API(Molehill) MD2模型範例'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-rGFYX_PgzZ4/TXi7TS_I1II/AAAAAAAAAbc/oTp7bzq6SiI/s72-c/demo_pic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-8291045885823829638</id><published>2011-03-09T04:05:00.000-08:00</published><updated>2011-05-05T07:29:36.965-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【教學】Flash 3D API(Molehill) Texture</title><content type='html'>Flash 3D API(Molehill)目前一些知名的3D引擎已有支援，&lt;br /&gt;像Alternativa3D、Away3D、Flare 3D 等，&lt;br /&gt;透過這些現有引擎建立3D專案非常方便。&lt;br /&gt;不過為了瞭解Flash 3D API的基本運作模式，&lt;br /&gt;還是研究了一下，此範例就是延續DrawMesh範例，&lt;br /&gt;Mesh由頂點著色改為貼上貼圖，&lt;br /&gt;原本頂點緩衝內的顏色rgb值改為UV貼圖座標。&lt;br /&gt;&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;    import com.adobe.utils.AGALMiniAssembler;&lt;br /&gt;    import com.adobe.utils.PerspectiveMatrix3D;&lt;br /&gt;&lt;br /&gt;    import flash.display.Sprite;&lt;br /&gt;    import flash.display.Stage3D;&lt;br /&gt;    import flash.display.StageAlign;&lt;br /&gt;    import flash.display.StageScaleMode;&lt;br /&gt;    import flash.display3D.Context3D;&lt;br /&gt;    import flash.display3D.Context3DRenderMode;&lt;br /&gt;    import flash.events.Event;&lt;br /&gt;    import flash.geom.Rectangle;&lt;br /&gt;    import flash.display3D.VertexBuffer3D;&lt;br /&gt;    import flash.display3D.Context3DVertexBufferFormat;&lt;br /&gt;    import flash.display3D.IndexBuffer3D;&lt;br /&gt;    import flash.display3D.Program3D;&lt;br /&gt;    import flash.geom.Matrix3D;&lt;br /&gt;    import flash.geom.Vector3D;&lt;br /&gt;    import flash.display3D.Context3DProgramType;&lt;br /&gt;    import flash.display3D.Context3DTextureFormat;&lt;br /&gt;    import flash.display3D.textures.Texture;&lt;br /&gt;    import flash.display.Bitmap;&lt;br /&gt;    import flash.display.BitmapData;&lt;br /&gt;    import flash.net.URLRequest;&lt;br /&gt;    import flash.display.Loader;&lt;br /&gt;&lt;br /&gt;    import MonitorKit;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * ...Flash 3D API(Molehill) 貼圖範例&lt;br /&gt;     * @author Max&lt;br /&gt;     */&lt;br /&gt;    public class Flash3D_Texture extends Sprite&lt;br /&gt;    {&lt;br /&gt;        private var sta3D:Stage3D;&lt;br /&gt;        private var con3D:Context3D;&lt;br /&gt;        private var vertexBuffer:VertexBuffer3D;&lt;br /&gt;        private var indexBuffer:IndexBuffer3D;&lt;br /&gt;&lt;br /&gt;        private var perspection:PerspectiveMatrix3D;&lt;br /&gt;        private var modelProjection:Matrix3D;&lt;br /&gt;        private var modelView:Matrix3D;&lt;br /&gt;&lt;br /&gt;        private var texture:Texture;&lt;br /&gt;        private var loaderObj:Loader;&lt;br /&gt;        private var shaderpg3d:Program3D;&lt;br /&gt;&lt;br /&gt;        public function Flash3D_Texture()&lt;br /&gt;        {&lt;br /&gt;            addEventListener(Event.ADDED_TO_STAGE, onAddtoStage);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function onAddtoStage(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;            stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt; &lt;br /&gt;            sta3D = stage.stage3Ds[0];&lt;br /&gt;            sta3D.addEventListener(Event.CONTEXT3D_CREATE, onCreateContext3D);&lt;br /&gt;            sta3D.requestContext3D(Context3DRenderMode.AUTO);&lt;br /&gt; &lt;br /&gt;            var FPS:MonitorKit = new MonitorKit(MonitorKit.MKMODE_TL);&lt;br /&gt;            addChild(FPS);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function onCreateContext3D(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            con3D = sta3D.context3D;&lt;br /&gt;            con3D.enableErrorChecking = true;&lt;br /&gt;            initTexture();  &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function initTexture():void&lt;br /&gt;        {&lt;br /&gt;            loaderObj = new Loader();&lt;br /&gt;            loaderObj.contentLoaderInfo.addEventListener(Event.COMPLETE,&lt;br /&gt;                                                         onLoaderBmpComple);&lt;br /&gt;            loaderObj.load(new URLRequest("pic.jpg"));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function onLoaderBmpComple(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            var tmploaderBmp:Bitmap = event.target.content as Bitmap;&lt;br /&gt;            texture = con3D.createTexture( 256, 256,&lt;br /&gt;                                           Context3DTextureFormat.BGRA, false);&lt;br /&gt;            texture.uploadFromBitmapData(tmploaderBmp.bitmapData,0);&lt;br /&gt;            initMesh();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function initMesh():void&lt;br /&gt;        {&lt;br /&gt;            var vertexShader:Array =["dp4 op.x, va0, vc0",&lt;br /&gt;                                     "dp4 op.y, va0, vc1",&lt;br /&gt;                                     "dp4 op.z, va0, vc2",&lt;br /&gt;                                     "dp4 op.w, va0, vc3",&lt;br /&gt;                                     "mov v0, va1.xyzw"];&lt;br /&gt;            var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            vertexAssembler.assemble(flash.display3D.Context3DProgramType.VERTEX,&lt;br /&gt;                                     vertexShader.join("\n"));&lt;br /&gt; &lt;br /&gt;            var fragmentShader:Array =["mov ft0, v0\n",&lt;br /&gt;                                       "tex ft1, ft0, fs1 &lt;2d,clamp,linear&gt;\n",&lt;br /&gt;                                       "mov oc, ft1\n"];&lt;br /&gt;            var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            fragmentAssembler.assemble(flash.display3D.Context3DProgramType.FRAGMENT,&lt;br /&gt;                                       fragmentShader.join("\n"));&lt;br /&gt; &lt;br /&gt;            shaderpg3d = con3D.createProgram();&lt;br /&gt;            shaderpg3d.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);&lt;br /&gt; &lt;br /&gt;            indexBuffer = con3D.createIndexBuffer(6);&lt;br /&gt;            indexBuffer.uploadFromVector(Vector.&lt;uint&gt;([0, 1, 2, 0, 2, 3]), 0, 6);&lt;br /&gt;  &lt;br /&gt;            vertexBuffer = con3D.createVertexBuffer(4, 4);&lt;br /&gt;            vertexBuffer.uploadFromVector(Vector.&lt;number&gt;([-1.0, 1.0,0.0,1.0,&lt;br /&gt;                                                           -1.0,-1.0,0.0,0.0,&lt;br /&gt;                                                            1.0,-1.0,1.0,0.0,&lt;br /&gt;                                                            1.0, 1.0,1.0,1.0]),0,4);&lt;br /&gt; &lt;br /&gt;            con3D.setVertexBufferAt( 0, vertexBuffer, 0,&lt;br /&gt;                                     Context3DVertexBufferFormat.FLOAT_2);&lt;br /&gt;            con3D.setVertexBufferAt( 1, vertexBuffer, 2,&lt;br /&gt;                                     Context3DVertexBufferFormat.FLOAT_2);&lt;br /&gt;            con3D.setTextureAt(1, texture);&lt;br /&gt; &lt;br /&gt;            addEventListener(Event.ENTER_FRAME, on3DRender);&lt;br /&gt;            stage.addEventListener(Event.RESIZE, onResizeStage);&lt;br /&gt;            onResizeStage();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function drawMesh():void&lt;br /&gt;        {&lt;br /&gt;            con3D.setProgram(shaderpg3d);&lt;br /&gt; &lt;br /&gt;            modelView = new Matrix3D();&lt;br /&gt;            modelView.identity();&lt;br /&gt;            modelView.position = new Vector3D(0, 0, 2, 1);&lt;br /&gt;            modelView.appendScale(1, -1, 1);&lt;br /&gt; &lt;br /&gt;            perspection = new PerspectiveMatrix3D();&lt;br /&gt;            perspection.identity();&lt;br /&gt;            perspection.perspectiveLH(5.5, 4, 1, 100);&lt;br /&gt; &lt;br /&gt;            modelProjection = new Matrix3D();&lt;br /&gt;            modelProjection.identity();&lt;br /&gt;            modelProjection.position = new Vector3D(0, 0, 0, 1);&lt;br /&gt;            modelProjection.appendRotation(stage.mouseX/4,&lt;br /&gt;                                           new Vector3D(0, 1, 0, 1),null);&lt;br /&gt;            modelProjection.append(modelView);&lt;br /&gt;            modelProjection.append(perspection);&lt;br /&gt; &lt;br /&gt;            con3D.setCulling("none");&lt;br /&gt;            con3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,&lt;br /&gt;                                                0,modelProjection,true);&lt;br /&gt;            con3D.drawTriangles(indexBuffer, 0, 2);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function onResizeStage(event:Event=null):void&lt;br /&gt;        {&lt;br /&gt;            con3D.configureBackBuffer(stage.stageWidth, stage.stageHeight,2,true);&lt;br /&gt;            sta3D.viewPort = new Rectangle(0,0,stage.stageWidth,stage.stageHeight);&lt;br /&gt;            on3DRender();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private function on3DRender(event:Event=null):void&lt;br /&gt;        {&lt;br /&gt;            con3D.clear(0.0, 0.0, 0.5, 1.0);&lt;br /&gt;            drawMesh();&lt;br /&gt;            con3D.present();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-mayksWTh_fI/TXd1LeOiKAI/AAAAAAAAAbU/11k3JePxy5Y/s1600/demo_pic.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 327px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5582059103102052354" border="0" alt="" src="http://1.bp.blogspot.com/-mayksWTh_fI/TXd1LeOiKAI/AAAAAAAAAbU/11k3JePxy5Y/s400/demo_pic.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_texture/Flash3D_Texture.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-8291045885823829638?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/8291045885823829638/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-apimolehill-texture.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8291045885823829638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8291045885823829638'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-apimolehill-texture.html' title='【教學】Flash 3D API(Molehill) Texture'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mayksWTh_fI/TXd1LeOiKAI/AAAAAAAAAbU/11k3JePxy5Y/s72-c/demo_pic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-6392213656829824092</id><published>2011-03-08T05:19:00.000-08:00</published><updated>2011-05-05T07:30:00.505-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【教學】Flash 3D API(Molehill) DrawSquareMesh</title><content type='html'>這是DrawTriangleMesh範例的延伸，&lt;br /&gt;也就是再增加一個頂點，&lt;br /&gt;四個頂點組成兩個三角面，&lt;br /&gt;其繪製的方式一樣。&lt;br /&gt;&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package &lt;br /&gt;{&lt;br /&gt;    import com.adobe.utils.AGALMiniAssembler;&lt;br /&gt;    import com.adobe.utils.PerspectiveMatrix3D; &lt;br /&gt;&lt;br /&gt;    import flash.display.Sprite;&lt;br /&gt;    import flash.display.Stage3D;&lt;br /&gt;    import flash.display.StageAlign;&lt;br /&gt;    import flash.display.StageScaleMode;&lt;br /&gt;    import flash.display3D.Context3D;&lt;br /&gt;    import flash.display3D.Context3DProgramType;&lt;br /&gt;    import flash.display3D.Context3DRenderMode;&lt;br /&gt;    import flash.display3D.Context3DTextureFormat;&lt;br /&gt;    import flash.display3D.Context3DVertexBufferFormat;&lt;br /&gt;    import flash.display3D.IndexBuffer3D;&lt;br /&gt;    import flash.display3D.Program3D;&lt;br /&gt;    import flash.display3D.VertexBuffer3D;&lt;br /&gt;    import flash.events.Event;&lt;br /&gt;    import flash.geom.Matrix3D;&lt;br /&gt;    import flash.geom.PerspectiveProjection;&lt;br /&gt;    import flash.geom.Rectangle;&lt;br /&gt;    import flash.geom.Vector3D;&lt;br /&gt;&lt;br /&gt;    public class Flash3D_DrawMesh extends Sprite&lt;br /&gt;    {&lt;br /&gt;        private var sta3D:Stage3D;&lt;br /&gt;        private var con3D:Context3D;&lt;br /&gt; &lt;br /&gt;        private var indexBuffer:IndexBuffer3D; &lt;br /&gt;        private var perspection:PerspectiveMatrix3D;&lt;br /&gt;        private var modelProjection:Matrix3D;&lt;br /&gt;        private var modelView:Matrix3D;&lt;br /&gt;  &lt;br /&gt;        private var ro:Number = 5;&lt;br /&gt;  &lt;br /&gt;        public function Flash3D_DrawMesh()&lt;br /&gt;        {&lt;br /&gt;            addEventListener(Event.ADDED_TO_STAGE, onAddtoStage);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onAddtoStage(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;            stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;            stage.frameRate = 30;&lt;br /&gt;    &lt;br /&gt;            sta3D = stage.stage3Ds[0];&lt;br /&gt;            sta3D.addEventListener(Event.CONTEXT3D_CREATE,onCreateContext3D);&lt;br /&gt;            sta3D.requestContext3D(Context3DRenderMode.AUTO); &lt;br /&gt;   &lt;br /&gt;            var FPS:MonitorKit = new MonitorKit(MonitorKit.MKMODE_TL);&lt;br /&gt;            addChild(FPS);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onCreateContext3D(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            con3D = sta3D.context3D;&lt;br /&gt;            con3D.enableErrorChecking = true;&lt;br /&gt;     &lt;br /&gt;            initMesh();&lt;br /&gt;   &lt;br /&gt;            addEventListener(Event.ENTER_FRAME,on3DRender);&lt;br /&gt;            stage.addEventListener(Event.RESIZE,onResizeStage);&lt;br /&gt;            onResizeStage();  &lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onResizeStage(event:Event = null):void&lt;br /&gt;        { &lt;br /&gt;            con3D.configureBackBuffer(stage.stageWidth,stage.stageHeight,2,true);&lt;br /&gt;            sta3D.viewPort = new Rectangle(0,0,stage.stageWidth,stage.stageHeight); &lt;br /&gt;            on3DRender();&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function initMesh():void&lt;br /&gt;        {  &lt;br /&gt;            var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            vertexAssembler.assemble(Context3DProgramType.VERTEX,"m44 op,va0,vc \n"+&lt;br /&gt;                                                                 "mov v0,va1");&lt;br /&gt;   &lt;br /&gt;            var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            fragmentAssembler.assemble(Context3DProgramType.FRAGMENT,"mov oc,v0");&lt;br /&gt;                &lt;br /&gt;            var vertexBuffer:VertexBuffer3D = con3D.createVertexBuffer(4,6);&lt;br /&gt;            vertexBuffer.uploadFromVector(Vector.&lt;Number&gt;([-1, 1,0,1,0,0,&lt;br /&gt;                                                           -1,-1,0,1,1,0,&lt;br /&gt;                                                            1,-1,0,1,0,1,&lt;br /&gt;                                                            1, 1,0,1,0,0]),0,4);&lt;br /&gt;&lt;br /&gt;            con3D.setVertexBufferAt(0,vertexBuffer,0,&lt;br /&gt;                                    Context3DVertexBufferFormat.FLOAT_3);&lt;br /&gt;            con3D.setVertexBufferAt(1,vertexBuffer,3,&lt;br /&gt;                                    Context3DVertexBufferFormat.FLOAT_3);&lt;br /&gt;   &lt;br /&gt;            indexBuffer= con3D.createIndexBuffer(6);&lt;br /&gt;            indexBuffer.uploadFromVector(Vector.&lt;uint&gt;([0,1,2,0,2,3]),0,6);&lt;br /&gt;   &lt;br /&gt;            var program:Program3D = con3D.createProgram();&lt;br /&gt;            program.upload(vertexAssembler.agalcode,fragmentAssembler.agalcode);&lt;br /&gt;            con3D.setProgram(program);&lt;br /&gt;   &lt;br /&gt;            modelView = new Matrix3D();&lt;br /&gt;            modelView.identity();&lt;br /&gt;     &lt;br /&gt;            perspection = new PerspectiveMatrix3D();&lt;br /&gt;            perspection.identity();&lt;br /&gt;            perspection.perspectiveLH(5.5, 4, 1, 10000); &lt;br /&gt;   &lt;br /&gt;            modelProjection = new Matrix3D(); &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private function drawMesh():void&lt;br /&gt;        {&lt;br /&gt;            modelView.position = new Vector3D(0,0,1.5,1); &lt;br /&gt;            modelView.appendRotation(ro,Vector3D.Z_AXIS, null); &lt;br /&gt;   &lt;br /&gt;            modelProjection.identity();&lt;br /&gt;            modelProjection.append(modelView);&lt;br /&gt;            modelProjection.append(perspection); &lt;br /&gt;     &lt;br /&gt;            con3D.setCulling("front");&lt;br /&gt;            con3D.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX,&lt;br /&gt;                                                 0,modelProjection,true);&lt;br /&gt;            con3D.drawTriangles(indexBuffer,0,2);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        private function on3DRender(event:Event=null):void&lt;br /&gt;        {&lt;br /&gt;            con3D.clear(0.0, 0.0, 0.5, 1.0); &lt;br /&gt;            drawMesh();&lt;br /&gt;            con3D.present();&lt;br /&gt;        } &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-QqUFOcwoSQ0/TXYtG4wrAzI/AAAAAAAAAbM/Y1subtnx3t8/s1600/demo_pic2.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 313px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5581698384511304498" border="0" alt="" src="http://3.bp.blogspot.com/-QqUFOcwoSQ0/TXYtG4wrAzI/AAAAAAAAAbM/Y1subtnx3t8/s400/demo_pic2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_drawsquare/Flash3D_DrawMesh.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-6392213656829824092?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/6392213656829824092/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-molehill-drawsquaremesh.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6392213656829824092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6392213656829824092'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-molehill-drawsquaremesh.html' title='【教學】Flash 3D API(Molehill) DrawSquareMesh'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-QqUFOcwoSQ0/TXYtG4wrAzI/AAAAAAAAAbM/Y1subtnx3t8/s72-c/demo_pic2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-8406841747402496054</id><published>2011-03-07T05:31:00.001-08:00</published><updated>2011-05-05T07:30:43.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【教學】Flash 3D API(Molehill) DrawTriangleMesh</title><content type='html'>利用先前範例所建立的基本框架，&lt;br /&gt;新增initMesh()函式，運用頂點緩衝與索引緩衝建立三角面，&lt;br /&gt;再透過AGALMiniAssembler來填上顏色，&lt;br /&gt;最後DrawMesh()把結果畫上。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-_ZeQcnBBpPg/TXTe2lHot_I/AAAAAAAAAbE/ax3_5F_MGSs/s1600/demo_pic1.jpg"&gt;&lt;img style="WIDTH: 344px; HEIGHT: 361px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5581330867477329906" border="0" alt="" src="http://1.bp.blogspot.com/-_ZeQcnBBpPg/TXTe2lHot_I/AAAAAAAAAbE/ax3_5F_MGSs/s400/demo_pic1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;    import com.adobe.utils.AGALMiniAssembler;&lt;br /&gt;    import com.adobe.utils.PerspectiveMatrix3D;&lt;br /&gt; &lt;br /&gt;    import flash.display.Sprite;&lt;br /&gt;    import flash.display.Stage3D;&lt;br /&gt;    import flash.display.StageAlign;&lt;br /&gt;    import flash.display.StageScaleMode;&lt;br /&gt;    import flash.display3D.Context3D;&lt;br /&gt;    import flash.display3D.Context3DProgramType;&lt;br /&gt;    import flash.display3D.Context3DRenderMode;&lt;br /&gt;    import flash.display3D.Context3DTextureFormat;&lt;br /&gt;    import flash.display3D.Context3DVertexBufferFormat;&lt;br /&gt;    import flash.display3D.IndexBuffer3D;&lt;br /&gt;    import flash.display3D.Program3D;&lt;br /&gt;    import flash.display3D.VertexBuffer3D;&lt;br /&gt;    import flash.events.Event;&lt;br /&gt;    import flash.geom.Matrix3D;&lt;br /&gt;    import flash.geom.PerspectiveProjection;&lt;br /&gt;    import flash.geom.Rectangle;&lt;br /&gt;    import flash.geom.Vector3D;&lt;br /&gt; &lt;br /&gt;    public class Flash3D_DrawTriangle extends Sprite&lt;br /&gt;    {&lt;br /&gt;        private var sta3D:Stage3D;&lt;br /&gt;        private var con3D:Context3D;&lt;br /&gt;  &lt;br /&gt;        private var vertexBuffer:VertexBuffer3D;&lt;br /&gt;        private var indexBuffer:IndexBuffer3D; &lt;br /&gt;  &lt;br /&gt;        private var modelView:Matrix3D;&lt;br /&gt;        private var modelProjection:Matrix3D;&lt;br /&gt;        private var perspection:PerspectiveMatrix3D;&lt;br /&gt;  &lt;br /&gt;        private var ro:Number = 5;&lt;br /&gt;        private var pos:Vector3D;&lt;br /&gt;  &lt;br /&gt;        public function Flash3D_DrawTriangle()&lt;br /&gt;        {&lt;br /&gt;            addEventListener(Event.ADDED_TO_STAGE, onAddtoStage);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onAddtoStage(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;            stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;            stage.frameRate = 30;&lt;br /&gt;   &lt;br /&gt;            sta3D = stage.stage3Ds[0];&lt;br /&gt;            sta3D.addEventListener(Event.CONTEXT3D_CREATE, onCreateContext3D);&lt;br /&gt;            sta3D.requestContext3D(Context3DRenderMode.AUTO);&lt;br /&gt;   &lt;br /&gt;            var FPS:MonitorKit = new MonitorKit(MonitorKit.MKMODE_TL);&lt;br /&gt;            addChild(FPS);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onCreateContext3D(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            con3D = sta3D.context3D;&lt;br /&gt;            con3D.enableErrorChecking = true;&lt;br /&gt;      &lt;br /&gt;            initMesh();&lt;br /&gt;   &lt;br /&gt;            addEventListener(Event.ENTER_FRAME, on3DRender);&lt;br /&gt;            stage.addEventListener(Event.RESIZE, onResizeStage);&lt;br /&gt;            onResizeStage();  &lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function onResizeStage(event:Event = null):void&lt;br /&gt;        { &lt;br /&gt;            con3D.configureBackBuffer(stage.stageWidth, stage.stageHeight, 2, true);&lt;br /&gt;            sta3D.viewPort = new Rectangle(0,0,stage.stageWidth, stage.stageHeight);&lt;br /&gt;            on3DRender();&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function initMesh():void&lt;br /&gt;        {&lt;br /&gt;            var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            vertexAssembler.assemble(Context3DProgramType.VERTEX,"m44 op,va0,vc0 \n"+&lt;br /&gt;                                                                 "mov v0,va1");&lt;br /&gt;   &lt;br /&gt;            var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler();&lt;br /&gt;            fragmentAssembler.assemble(Context3DProgramType.FRAGMENT,"mov oc,v0");&lt;br /&gt;    &lt;br /&gt;            vertexBuffer = con3D.createVertexBuffer(3,6);&lt;br /&gt;            vertexBuffer.uploadFromVector(Vector.&lt;number&gt;([ 0, 1,0,1,0,0,&lt;br /&gt;                                                           -1,-1,0,0,1,0,&lt;br /&gt;                                                            1,-1,0,0,0,1,]),0, 3);&lt;br /&gt;                &lt;br /&gt;           con3D.setVertexBufferAt(0,vertexBuffer,0,&lt;br /&gt;                                   Context3DVertexBufferFormat.FLOAT_3);&lt;br /&gt;           con3D.setVertexBufferAt(1,vertexBuffer,3,&lt;br /&gt;                                   Context3DVertexBufferFormat.FLOAT_3);&lt;br /&gt;   &lt;br /&gt;           indexBuffer = con3D.createIndexBuffer(3);&lt;br /&gt;           indexBuffer.uploadFromVector(Vector.&lt;uint&gt;([0,1,2]),0,3);&lt;br /&gt;   &lt;br /&gt;           var program:Program3D = con3D.createProgram();&lt;br /&gt;           program.upload(vertexAssembler.agalcode,fragmentAssembler.agalcode);&lt;br /&gt;           con3D.setProgram(program);&lt;br /&gt;   &lt;br /&gt;           modelView = new Matrix3D();&lt;br /&gt;           modelView.identity();&lt;br /&gt;           pos = new Vector3D(0,0,2,1);&lt;br /&gt;   &lt;br /&gt;           perspection = new PerspectiveMatrix3D();&lt;br /&gt;           perspection.identity();&lt;br /&gt;           perspection.perspectiveLH(2.8,2,1,10000);  &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public function DrawMesh():void&lt;br /&gt;        {&lt;br /&gt;            modelView.position = pos;&lt;br /&gt;            modelView.appendRotation(ro,Vector3D.Y_AXIS, null);&lt;br /&gt;   &lt;br /&gt;            modelProjection = new Matrix3D();&lt;br /&gt;            modelProjection.identity();&lt;br /&gt;            modelProjection.append(modelView);&lt;br /&gt;            modelProjection.append(perspection);&lt;br /&gt;   &lt;br /&gt;            con3D.setCulling("none");&lt;br /&gt;            con3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,&lt;br /&gt;                                                0,modelProjection,true);&lt;br /&gt;            con3D.drawTriangles(indexBuffer,0,-1);&lt;br /&gt;        }&lt;br /&gt;  &lt;br /&gt;        public function on3DRender(event:Event):void&lt;br /&gt;        {&lt;br /&gt;            con3D.clear(0.0, 0.0, 0.5, 1.0);&lt;br /&gt;            DrawMesh(); &lt;br /&gt;            con3D.present();&lt;br /&gt;        } &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-zwWPeqcrnS4/TXTeyYgyNXI/AAAAAAAAAa8/y4sdClzp1E4/s1600/demo_pic2.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 314px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5581330795373671794" border="0" alt="" src="http://2.bp.blogspot.com/-zwWPeqcrnS4/TXTeyYgyNXI/AAAAAAAAAa8/y4sdClzp1E4/s400/demo_pic2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_flash3d_drawtriangle/Flash3D_DrawTriangle.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-8406841747402496054?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/8406841747402496054/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-molehill-drawtrianglemesh.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8406841747402496054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8406841747402496054'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d-molehill-drawtrianglemesh.html' title='【教學】Flash 3D API(Molehill) DrawTriangleMesh'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_ZeQcnBBpPg/TXTe2lHot_I/AAAAAAAAAbE/ax3_5F_MGSs/s72-c/demo_pic1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-4709248149514902202</id><published>2011-03-06T06:27:00.000-08:00</published><updated>2011-03-09T04:07:24.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash 3D'/><title type='text'>【教學】Flash 3D API(Molehill) 基本框架建立</title><content type='html'>Molehill 3D前陣子很多人在討論，&lt;br /&gt;最近也研究了一下，發現3D環境都是大同小異，&lt;br /&gt;所以寫了一個3D的基本框架測試範例，&lt;br /&gt;使用到 Flex SDK Hero(版本19784)，&lt;br /&gt;Flash Player 11.0.0.58 Incubator，&lt;br /&gt;本範例開發工具使用FlashDevelop，&lt;br /&gt;也可以使用Adobe Flash Builder 4或Flash CS5。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-tpTxrRj5FKs/TXObctuZ-0I/AAAAAAAAAas/GzwRBFmKWiM/s1600/demo_pic1.jpg"&gt;&lt;img style="WIDTH: 303px; HEIGHT: 226px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5580975280855055170" border="0" alt="" src="http://1.bp.blogspot.com/-tpTxrRj5FKs/TXObctuZ-0I/AAAAAAAAAas/GzwRBFmKWiM/s400/demo_pic1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;    import flash.display.Sprite;&lt;br /&gt;    import flash.display.Stage3D;&lt;br /&gt;    import flash.display.StageAlign;&lt;br /&gt;    import flash.display.StageScaleMode;&lt;br /&gt;    import flash.display3D.Context3D;&lt;br /&gt;    import flash.display3D.Context3DRenderMode;&lt;br /&gt;    import flash.events.Event;&lt;br /&gt;    import flash.geom.Matrix3D;&lt;br /&gt;    import flash.geom.Rectangle;&lt;br /&gt; &lt;br /&gt;    import MonitorKit;&lt;br /&gt; &lt;br /&gt;    /**&lt;br /&gt;    * ...Flash 3D Framework&lt;br /&gt;    * @author Max&lt;br /&gt;    */&lt;br /&gt;    public class Flash3D_Framework extends Sprite&lt;br /&gt;    {&lt;br /&gt;        private var sta3D:Stage3D;&lt;br /&gt;        private var con3D:Context3D;&lt;br /&gt;  &lt;br /&gt;    public function Flash3D_Framework():void&lt;br /&gt;    {&lt;br /&gt;       addEventListener(Event.ADDED_TO_STAGE, onAddtoStage); &lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public function onAddtoStage(event:Event):void&lt;br /&gt;    {&lt;br /&gt;       stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;       stage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;  &lt;br /&gt;       sta3D = stage.stage3Ds[0];&lt;br /&gt;       sta3D.addEventListener(Event.CONTEXT3D_CREATE, onCreateContext3D);&lt;br /&gt;       sta3D.requestContext3D(Context3DRenderMode.AUTO);&lt;br /&gt;       // 設定FPS&lt;br /&gt;       var FPS:MonitorKit = new MonitorKit(MonitorKit.MKMODE_TL);&lt;br /&gt;       addChild(FPS);&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public function onCreateContext3D(event:Event):void&lt;br /&gt;    {&lt;br /&gt;       con3D = sta3D.context3D;&lt;br /&gt;       con3D.enableErrorChecking = true;&lt;br /&gt;   &lt;br /&gt;       addEventListener(Event.ENTER_FRAME, on3DRender);&lt;br /&gt;       stage.addEventListener(Event.RESIZE, onResizeStage);&lt;br /&gt;       onResizeStage();  &lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public function onResizeStage(event:Event = null):void&lt;br /&gt;    {&lt;br /&gt;       // 設定背景緩衝&lt;br /&gt;        con3D.configureBackBuffer(stage.stageWidth, stage.stageHeight, 2, true);&lt;br /&gt;       // 讓成像大小等於stage的大小&lt;br /&gt;        sta3D.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);&lt;br /&gt;       on3DRender();&lt;br /&gt;    }&lt;br /&gt;    // 3D渲染 &lt;br /&gt;    public function on3DRender(event:Event = null):void&lt;br /&gt;    {&lt;br /&gt;       // 設定3D背景色(rgba)&lt;br /&gt;       con3D.clear(0.0, 0.0, 0.5, 1.0);&lt;br /&gt;       // ...&lt;br /&gt;       // 要繪製3D的處理可以加在這...&lt;br /&gt;       // ...   &lt;br /&gt;       con3D.present();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-S8GLWNd1wAs/TXObW4gEd8I/AAAAAAAAAak/eHXYIivbho0/s1600/demo_pic2.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 323px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5580975180668499906" border="0" alt="" src="http://1.bp.blogspot.com/-S8GLWNd1wAs/TXObW4gEd8I/AAAAAAAAAak/eHXYIivbho0/s400/demo_pic2.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-4709248149514902202?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/4709248149514902202/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4709248149514902202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4709248149514902202'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2011/03/flash-3d.html' title='【教學】Flash 3D API(Molehill) 基本框架建立'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-tpTxrRj5FKs/TXObctuZ-0I/AAAAAAAAAas/GzwRBFmKWiM/s72-c/demo_pic1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-256614893791032885</id><published>2010-11-17T10:17:00.001-08:00</published><updated>2011-05-05T07:31:21.537-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Director'/><title type='text'>【教學】Director 3D與PhysX 物理引擎</title><content type='html'>CasetMember視窗:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOQcamCJmMI/AAAAAAAAAaE/ZJMJZ9FoDR8/s1600/pic1.jpg"&gt;&lt;img style="WIDTH: 329px; HEIGHT: 297px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5540584684784294082" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOQcamCJmMI/AAAAAAAAAaE/ZJMJZ9FoDR8/s400/pic1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lingo程式代碼:&lt;br /&gt;----------Movie Script:"main"&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;global pDirPhyz  -- 物理引擎&lt;br /&gt;global pTimeStep -- 影響時間&lt;br /&gt;global pSubSteps -- 計算動力係數&lt;br /&gt;global resSphere -- 球的模型資源&lt;br /&gt;global modSphere -- 球的模型&lt;br /&gt;global resBox    -- 方塊的模型資源&lt;br /&gt;global modBox    -- 方塊模型&lt;br /&gt;global resFloor  -- 地板模型資源&lt;br /&gt;global modFloor  -- 地板模型&lt;br /&gt;&lt;br /&gt;on startmovie&lt;br /&gt; &lt;br /&gt;  --W3D&lt;br /&gt;  member("Scene3D").resetworld()&lt;br /&gt; &lt;br /&gt;  -------------------------------------&lt;br /&gt;  --建立球體模型&lt;br /&gt;  resSphere = member("Scene3D").newModelResource("SphereRes",#sphere,#front)&lt;br /&gt;  resSphere.radius = 10&lt;br /&gt;  resSphere.resolution = 6&lt;br /&gt; &lt;br /&gt;  modSphere = member("Scene3D").newModel("SphereRes")&lt;br /&gt;  modSphere.resource = resSphere&lt;br /&gt;  modSphere.transform.position = vector(50,100,-20)&lt;br /&gt;  modSphere.addmodifier(#meshdeform)&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;  -------------------------------------&lt;br /&gt;  --建立方塊模型&lt;br /&gt;  resBox = member("Scene3D").newModelResource("BoxRes",#Box,#front)&lt;br /&gt;  resBox.height = 5&lt;br /&gt;  resBox.width = 100&lt;br /&gt;  resBox.length = 100&lt;br /&gt;  resBox.lengthVertices = 5&lt;br /&gt;  resBox.widthVertices = 5&lt;br /&gt;  resBox.heightVertices = 2&lt;br /&gt; &lt;br /&gt;  modBox = member("Scene3D").newModel("BoxRes")&lt;br /&gt;  modBox.resource = resBox&lt;br /&gt;  modBox.transform.position = vector(20,0,-20)&lt;br /&gt;  modBox.transform.rotation = vector(10,10,20)&lt;br /&gt;  modBox.addmodifier(#meshdeform)&lt;br /&gt; &lt;br /&gt;  -----------------------------------------&lt;br /&gt;  --建立地板模型&lt;br /&gt;  resFloor = member("Scene3D").newModelResource("FloorRes",#Box,#front)&lt;br /&gt;  resFloor.height = 5&lt;br /&gt;  resFloor.width = 200&lt;br /&gt;  resFloor.length = 200&lt;br /&gt;  resFloor.lengthVertices = 5&lt;br /&gt;  resFloor.widthVertices = 5&lt;br /&gt;  resFloor.heightVertices = 2&lt;br /&gt; &lt;br /&gt;  modFloor = member("Scene3D").newModel("FloorRes")&lt;br /&gt;  modFloor.resource = resFloor&lt;br /&gt;  modFloor.transform.position = vector(0,-70,0)&lt;br /&gt;  modFloor.transform.rotation = vector(0,0,0)&lt;br /&gt;  modFloor.addmodifier(#meshdeform)&lt;br /&gt; &lt;br /&gt;  ------------------------------------------&lt;br /&gt;  --物理引擎&lt;br /&gt;  pDirPhyz = member("physX")&lt;br /&gt;  pTimeStep = 0.2&lt;br /&gt;  pSubSteps = 10&lt;br /&gt; &lt;br /&gt;  --初始引擎&lt;br /&gt;  pDirPhyz.Init(member("Scene3D"), vector(1,1,1),#equal, pTimeStep, pSubSteps )&lt;br /&gt;  pDirPhyz.gravity = vector(0,-9.8,0)&lt;br /&gt;  pDirPhyz.contacttolerance = 0.2&lt;br /&gt;  pDirPhyz.friction = 0.2&lt;br /&gt;  pDirPhyz.lineardamping = 0.4&lt;br /&gt;  pDirPhyz.angulardamping = 0.4&lt;br /&gt;  pDirPhyz.restitution = 0.9&lt;br /&gt; &lt;br /&gt;  --引擎套用到球模型&lt;br /&gt;  rb_ball=pDirPhyz.createRigidBody(modSphere.name,modSphere.name,#sphere,#dynamic)&lt;br /&gt;  rb_ball.mass = 100&lt;br /&gt; &lt;br /&gt;  --引擎套用到方塊模型&lt;br /&gt;  rb_box=pDirPhyz.createRigidBody(modBox.name,modBox.name,#Box,#static )&lt;br /&gt;  rb_box.mass = 100&lt;br /&gt; &lt;br /&gt;  --引擎套用到地板模型&lt;br /&gt;  rb_floor=pDirPhyz.createRigidBody(modFloor.name,modFloor.name,#Box,#static )&lt;br /&gt;  rb_floor.mass = 100&lt;br /&gt; &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;on endSprite me&lt;br /&gt;  if (pDirPhyz.isInitialized = 1) then&lt;br /&gt;    pDirPhyz.destroy()&lt;br /&gt;  end if&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;----------Frame Script:"loop"&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;global pDirPhyz  -- 物理引擎&lt;br /&gt;global pTimeStep -- 影響時間&lt;br /&gt;global pSubSteps -- 計算動力係數&lt;br /&gt;&lt;br /&gt;on exitFrame&lt;br /&gt;  pDirPhyz.simulate()&lt;br /&gt; &lt;br /&gt;  go to the frame&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Score視窗:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TOQce9lS2fI/AAAAAAAAAaM/HaRaq4aGPPI/s1600/pic2.jpg"&gt;&lt;img style="WIDTH: 383px; HEIGHT: 329px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5540584759825193458" border="0" alt="" src="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TOQce9lS2fI/AAAAAAAAAaM/HaRaq4aGPPI/s400/pic2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TOQci6he5-I/AAAAAAAAAaU/9l_A5CXo3g8/s1600/pic3.jpg"&gt;&lt;img style="WIDTH: 319px; HEIGHT: 241px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5540584827723376610" border="0" alt="" src="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TOQci6he5-I/AAAAAAAAAaU/9l_A5CXo3g8/s400/pic3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_lingo_physx/PhysX_demo_3.htm" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-256614893791032885?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/256614893791032885/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/director-3dphysx.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/256614893791032885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/256614893791032885'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/director-3dphysx.html' title='【教學】Director 3D與PhysX 物理引擎'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOQcamCJmMI/AAAAAAAAAaE/ZJMJZ9FoDR8/s72-c/pic1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-3856319437433094603</id><published>2010-11-15T05:55:00.000-08:00</published><updated>2010-11-15T06:41:59.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES LoadTexture</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加一個建立平面的方法，&lt;br /&gt;並於該平面上貼上一張512*512的pic.png貼圖，&lt;br /&gt;貼圖置於專案res/drawable/內，&lt;br /&gt;專案為A3DLoadTexture，其A3DMain內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOFBDOmC8wI/AAAAAAAAAZ0/QKFfKMIXH4A/s1600/android_texture_project.jpg"&gt;&lt;img style="WIDTH: 247px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5539780540355506946" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOFBDOmC8wI/AAAAAAAAAZ0/QKFfKMIXH4A/s400/android_texture_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DView類別內部分修正，&lt;br /&gt;於A3DRender()內增加context參數:&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import com.max.A3DRender;&lt;br /&gt;&lt;br /&gt;public class A3DView extends GLSurfaceView{&lt;br /&gt;  private A3DRender mA3DRender;&lt;br /&gt;  public A3DView(Context cont){&lt;br /&gt;    super(cont);&lt;br /&gt;    mA3DRender = new A3DRender(cont);&lt;br /&gt;    setRenderer(mA3DRender);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A3DRender類別程式碼:&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import android.opengl.GLUtils;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.FloatBuffer;&lt;br /&gt;import java.nio.ShortBuffer;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.graphics.Bitmap;&lt;br /&gt;import android.graphics.BitmapFactory;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;&lt;br /&gt;  private Context context;&lt;br /&gt;  private final static int VERTS = 4;&lt;br /&gt;  //頂點座標&lt;br /&gt;  float squVtx[] = { -1.0f,  1.0f,  0.0f,  //v0&lt;br /&gt;                     -1.0f, -1.0f,  0.0f,  //v1&lt;br /&gt;                      1.0f, -1.0f,  0.0f,  //v2&lt;br /&gt;                      1.0f,  1.0f,  0.0f };//v3&lt;br /&gt;  //頂點索引&lt;br /&gt;  short squInx[] = { 0, 1, 2,   //Face1&lt;br /&gt;                     0, 2, 3 }; //Face2&lt;br /&gt;  //UV貼圖座標&lt;br /&gt;  float squTex[] ={ 0.0f, 0.0f,  //v0&lt;br /&gt;                    0.0f, 1.0f,  //v1&lt;br /&gt;                    1.0f, 1.0f,  //v2&lt;br /&gt;                    1.0f, 0.0f };//v3&lt;br /&gt;&lt;br /&gt;  private int[] textureID = new int[1];&lt;br /&gt; &lt;br /&gt;  public A3DRender(Context context){&lt;br /&gt;    this.context = context;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl, EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);&lt;br /&gt;    gl.glClearDepthf(1.0f);&lt;br /&gt;    gl.glEnable(GL10.GL_DEPTH_TEST);&lt;br /&gt;    gl.glDepthFunc(GL10.GL_LEQUAL);&lt;br /&gt;    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);&lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);&lt;br /&gt;    gl.glDisable(GL10.GL_DITHER);&lt;br /&gt;    //載入貼圖  &lt;br /&gt;    LoadTexture(gl,context);&lt;br /&gt;    gl.glEnable(GL10.GL_TEXTURE_2D);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl, int w, int h){&lt;br /&gt;    if(h==0)h=1;&lt;br /&gt;    float aspect = (float)w/h; &lt;br /&gt;    gl.glViewport(0, 0, w, h);&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    GLU.gluPerspective(gl, 45, aspect, 0.1f, 100.0f);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){&lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  &lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODELVIEW);&lt;br /&gt;    gl.glLoadIdentity();&lt;br /&gt;    GLU.gluLookAt(gl, 0, 0, 4, 0, 0, 0, 0, 1, 0);&lt;br /&gt;    gl.glFrontFace(GL10.GL_CCW);&lt;br /&gt;    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;    //建立平面 &lt;br /&gt;    initPlane(gl, squVtx , squInx, squTex);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void initPlane(GL10 gl,float[] vtx, short[] inx , float[] tx){ &lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, getFloatBuffer(vtx));&lt;br /&gt;    gl.glTexCoordPointer( 2, GL10.GL_FLOAT, 0, getFloatBuffer(tx));&lt;br /&gt;    gl.glDrawElements(GL10.GL_TRIANGLES,&lt;br /&gt;                      inx.length, &lt;br /&gt;                      GL10.GL_UNSIGNED_SHORT, &lt;br /&gt;                      getShortBuffer(inx));&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void LoadTexture(GL10 gl, Context cont){&lt;br /&gt;    gl.glGenTextures(1, textureID, 0); &lt;br /&gt;    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[0]);&lt;br /&gt;    gl.glTexParameterf(GL10.GL_TEXTURE_2D, &lt;br /&gt;                       GL10.GL_TEXTURE_MAG_FILTER, &lt;br /&gt;                       GL10.GL_LINEAR);&lt;br /&gt;    gl.glTexParameterf(GL10.GL_TEXTURE_2D,&lt;br /&gt;                       GL10.GL_TEXTURE_MIN_FILTER,&lt;br /&gt;                       GL10.GL_LINEAR);&lt;br /&gt;  &lt;br /&gt;    InputStream istream = cont.getResources().openRawResource(R.drawable.pic);&lt;br /&gt;    Bitmap bitmap;&lt;br /&gt;    try{&lt;br /&gt;      bitmap = BitmapFactory.decodeStream(istream);&lt;br /&gt;    }finally{&lt;br /&gt;      try{&lt;br /&gt;        istream.close();&lt;br /&gt;      }catch(IOException e){&lt;br /&gt;      }&lt;br /&gt;    } &lt;br /&gt;    GLUtils.texImage2D( GL10.GL_TEXTURE_2D, 0, bitmap, 0 ); &lt;br /&gt;    bitmap.recycle();&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private FloatBuffer getFloatBuffer(float[] table ){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect(table.length * 4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    FloatBuffer fb = bb.asFloatBuffer();&lt;br /&gt;    fb.put(table);&lt;br /&gt;    fb.position(0);&lt;br /&gt;    return fb;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private ShortBuffer getShortBuffer(short[] array ){&lt;br /&gt;    ByteBuffer ib = ByteBuffer.allocateDirect(array.length * 2);&lt;br /&gt;    ib.order(ByteOrder.nativeOrder());&lt;br /&gt;    ShortBuffer sb = ib.asShortBuffer();&lt;br /&gt;    sb.put(array);&lt;br /&gt;    sb.position(0);&lt;br /&gt;    return sb;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOFBIKyywxI/AAAAAAAAAZ8/YSzECUd22Fw/s1600/android_texture_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 283px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5539780625234576146" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOFBIKyywxI/AAAAAAAAAZ8/YSzECUd22Fw/s400/android_texture_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-3856319437433094603?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/3856319437433094603/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-loadtexture.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3856319437433094603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3856319437433094603'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-loadtexture.html' title='【教學】Android OpenGL ES LoadTexture'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TOFBDOmC8wI/AAAAAAAAAZ0/QKFfKMIXH4A/s72-c/android_texture_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-8391389901644813729</id><published>2010-11-11T20:27:00.000-08:00</published><updated>2010-11-11T20:39:56.404-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES Primitive_Cube</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫方體的方法，&lt;br /&gt;先前畫Mesh範例用到頂點緩衝，&lt;br /&gt;此次增加索引緩衝，&lt;br /&gt;先定義出八個頂點的位置資訊，&lt;br /&gt;再用索引依序定義出各個三角面，&lt;br /&gt;專案為A3DCube，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNzDhQ1JE7I/AAAAAAAAAZU/iment-X6VQ4/s1600/android_cube_project.jpg"&gt;&lt;img style="WIDTH: 316px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5538516617979827122" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNzDhQ1JE7I/AAAAAAAAAZU/iment-X6VQ4/s400/android_cube_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DRender內新增drawCube方法，&lt;br /&gt;此方法只用簡單的頂點緩衝VertexBuffer與索引緩衝IndexBuffer，&lt;br /&gt;透過OpenGL函式glDrawElements來畫出方體。&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import android.os.SystemClock;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.FloatBuffer;&lt;br /&gt;import java.nio.ShortBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;&lt;br /&gt;  private final static int VERTS = 8;&lt;br /&gt;  //頂點座標&lt;br /&gt;  float cubeVtx[] = { -1.0f,  1.0f, -1.0f,   //v0&lt;br /&gt;                      -1.0f,  1.0f,  1.0f,   //v1&lt;br /&gt;                       1.0f,  1.0f,  1.0f,   //v2&lt;br /&gt;                       1.0f,  1.0f, -1.0f,   //v3&lt;br /&gt;                      -1.0f, -1.0f, -1.0f,   //v4&lt;br /&gt;                      -1.0f, -1.0f,  1.0f,   //v5&lt;br /&gt;                       1.0f, -1.0f,  1.0f,   //v6&lt;br /&gt;                       1.0f, -1.0f, -1.0f }; //v7&lt;br /&gt;  //頂點索引&lt;br /&gt;  short cubeInx[] = { 0, 1, 2,   //Top_Face1&lt;br /&gt;                      0, 2, 3,   //Top_Face2&lt;br /&gt;                      4, 6, 5,   //Bottom_Face1&lt;br /&gt;                      4, 7, 6,   //Bottom_Face2&lt;br /&gt;                      2, 6, 7,   //Left_face1&lt;br /&gt;                      2, 7, 3,   //Left_Face2&lt;br /&gt;                      0, 4, 1,   //Right_Face1&lt;br /&gt;                      1, 4, 5,   //Right_Face2&lt;br /&gt;                      1, 5, 6,   //Front_Face1&lt;br /&gt;                      1, 6, 2,   //Front_Face2&lt;br /&gt;                      0, 3, 4,   //Back_Face1&lt;br /&gt;                      3, 7, 4 }; //Back_Face2&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); &lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);&lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST); &lt;br /&gt;    gl.glClearDepthf(1.0f);&lt;br /&gt;    gl.glDepthFunc(GL10.GL_LEQUAL);&lt;br /&gt;    gl.glEnable(GL10.GL_DEPTH_TEST);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport(0, 0, w, h);&lt;br /&gt;    float ratio;&lt;br /&gt;    ratio = (float)w/h;&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){ &lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); &lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODELVIEW);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    GLU.gluLookAt(gl, 0, 0, 4, 0, 0, 0, 0, 1, 0);&lt;br /&gt;    gl.glFrontFace(GL10.GL_CCW);  &lt;br /&gt;    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    //設置光源 &lt;br /&gt;    gl.glEnable(GL10.GL_LIGHT1);&lt;br /&gt;    FloatBuffer lightAmbient = FloatBuffer.wrap(new float[]{0.2f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightDiffuse = FloatBuffer.wrap(new float[]{0.8f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightSpecular =  FloatBuffer.wrap(new float[]{1.0f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightPosition = FloatBuffer.wrap(new float[]{3.0f,4.0f,10.0f,1.0f});&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, lightAmbient);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, lightDiffuse);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_SPECULAR, lightSpecular);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, lightPosition);&lt;br /&gt;    gl.glEnable(GL10.GL_LIGHTING);&lt;br /&gt;    //動態旋轉  &lt;br /&gt;    long time = SystemClock.uptimeMillis()% 4000L;&lt;br /&gt;    float angle = 0.090f * ((int)time);&lt;br /&gt;    gl.glRotatef(angle, 1.0f, 0.0f, 0.0f);&lt;br /&gt;    gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);&lt;br /&gt;    gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);&lt;br /&gt;    //畫出方體  &lt;br /&gt;    drawCube( gl, cubeVtx , cubeInx );   &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void drawCube(GL10 gl,float[] vtx, short[] inx){ &lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, getFloatBuffer(vtx));&lt;br /&gt;    //透過索引緩衝來畫三角面&lt;br /&gt;    gl.glDrawElements(GL10.GL_TRIANGLES,&lt;br /&gt;                      inx.length,&lt;br /&gt;                      GL10.GL_UNSIGNED_SHORT,&lt;br /&gt;                      getShortBuffer(inx));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //頂點緩衝  &lt;br /&gt;  private FloatBuffer getFloatBuffer(float[] array ){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect(array.length * 4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    FloatBuffer fb = bb.asFloatBuffer();&lt;br /&gt;    fb.put(array);&lt;br /&gt;    fb.position(0);&lt;br /&gt;    return fb;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //索引緩衝&lt;br /&gt;  private ShortBuffer getShortBuffer(short[] array ){&lt;br /&gt;    ByteBuffer ib = ByteBuffer.allocateDirect(array.length * 2);&lt;br /&gt;    ib.order(ByteOrder.nativeOrder());&lt;br /&gt;    ShortBuffer sb = ib.asShortBuffer();&lt;br /&gt;    sb.put(array);&lt;br /&gt;    sb.position(0);&lt;br /&gt;    return sb;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNzDnmhl84I/AAAAAAAAAZc/yU7K4y74EZ0/s1600/android_cube_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 283px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5538516726882628482" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNzDnmhl84I/AAAAAAAAAZc/yU7K4y74EZ0/s400/android_cube_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-8391389901644813729?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/8391389901644813729/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-primitivecube.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8391389901644813729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/8391389901644813729'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-primitivecube.html' title='【教學】Android OpenGL ES Primitive_Cube'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNzDhQ1JE7I/AAAAAAAAAZU/iment-X6VQ4/s72-c/android_cube_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-7152694567586574022</id><published>2010-11-05T06:57:00.000-07:00</published><updated>2010-11-05T07:29:05.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES Primitive_Sphere</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫球體的方法，&lt;br /&gt;於場景中增加一個光源，&lt;br /&gt;專案為A3DSphere，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNQQSrHukDI/AAAAAAAAAZE/NrDC2q5rwBs/s1600/android_sphere_project.jpg"&gt;&lt;img style="WIDTH: 263px; HEIGHT: 390px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5536067754944008242" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNQQSrHukDI/AAAAAAAAAZE/NrDC2q5rwBs/s400/android_sphere_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;程式碼如下:&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.FloatBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); &lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);&lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST); &lt;br /&gt;    gl.glClearDepthf(1.0f);&lt;br /&gt;    gl.glDepthFunc(GL10.GL_LEQUAL);&lt;br /&gt;    gl.glEnable(GL10.GL_DEPTH_TEST);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport(0, 0, w, h);&lt;br /&gt;    float ratio;&lt;br /&gt;    ratio = (float)w/h;&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){ &lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); &lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODELVIEW);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    GLU.gluLookAt(gl, 0, 0, 6, 0, 0, 0, 0, 1, 0);&lt;br /&gt;    gl.glFrontFace(GL10.GL_CCW);&lt;br /&gt;    gl.glEnable(GL10.GL_LIGHT1);&lt;br /&gt;    //設置光源&lt;br /&gt;    FloatBuffer lightAmbient = FloatBuffer.wrap(new float[]{0.2f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightDiffuse = FloatBuffer.wrap(new float[]{0.8f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightSpecular = FloatBuffer.wrap(new float[]{1.0f,0.0f,0.0f,1.0f});&lt;br /&gt;    FloatBuffer lightPosition = FloatBuffer.wrap(new float[]{3.0f,4.0f,10.0f,1.0f});&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, lightAmbient);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, lightDiffuse);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_SPECULAR, lightSpecular);&lt;br /&gt;    gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, lightPosition);&lt;br /&gt;    gl.glEnable(GL10.GL_LIGHTING);&lt;br /&gt;    //畫球體&lt;br /&gt;    drawSphere( gl, 2.0f, 32, 24 );&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void drawSphere(GL10 gl, float radius, int stacks, int slices){&lt;br /&gt;    FloatBuffer vertex = allocateFloatBuffer(4*6*stacks*(slices+1));&lt;br /&gt;    FloatBuffer normal = allocateFloatBuffer(4*6*stacks*(slices+1));&lt;br /&gt;    int triangles;&lt;br /&gt;    float stackstemp;&lt;br /&gt;    float slicestemp;&lt;br /&gt;    stackstemp = (float)Math.PI / stacks;&lt;br /&gt;    slicestemp = 2.0f*(float)Math.PI/ slices;&lt;br /&gt;    int i;&lt;br /&gt;    for(i=0; i &lt; stacks; ++i ){&lt;br /&gt;      float a = i*stackstemp;&lt;br /&gt;      float b = a+stackstemp;&lt;br /&gt;      float s0 = (float)Math.sin(a);&lt;br /&gt;      float s1 = (float)Math.sin(b);&lt;br /&gt;      float c0 = (float)Math.cos(a);&lt;br /&gt;      float c1 = (float)Math.cos(b); &lt;br /&gt;      float nv;&lt;br /&gt;      for(int j=0; j&lt;= slices;++j){&lt;br /&gt;        float c = j*slicestemp;&lt;br /&gt;        float x = (float)Math.cos(c);&lt;br /&gt;        float y = (float)Math.sin(c);&lt;br /&gt;        nv = x * s0;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius); &lt;br /&gt;        nv = y * s0;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius); &lt;br /&gt;        nv = c0;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius); &lt;br /&gt;        nv = x * s1;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius); &lt;br /&gt;        nv = y * s1;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius); &lt;br /&gt;        nv = c1;&lt;br /&gt;        normal.put(nv);&lt;br /&gt;        vertex.put(nv*radius);&lt;br /&gt;      } &lt;br /&gt;    }&lt;br /&gt;    normal.position(0);&lt;br /&gt;    vertex.position(0);&lt;br /&gt;  &lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertex);&lt;br /&gt;    gl.glNormalPointer(GL10.GL_FLOAT, 0, normal); &lt;br /&gt;    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); &lt;br /&gt;    triangles = (slices+1)*2;&lt;br /&gt;    int k;&lt;br /&gt;    for( k=0; k &lt; stacks; k++ ){&lt;br /&gt;      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, k*triangles, triangles);  &lt;br /&gt;    }  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private FloatBuffer allocateFloatBuffer(int capacity){&lt;br /&gt;    ByteBuffer vbb = ByteBuffer.allocateDirect(capacity);&lt;br /&gt;    vbb.order(ByteOrder.nativeOrder());&lt;br /&gt;    return vbb.asFloatBuffer();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNQQd-mFJBI/AAAAAAAAAZM/I_Zhn8iPpHk/s1600/android_sphere_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 282px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5536067949150151698" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNQQd-mFJBI/AAAAAAAAAZM/I_Zhn8iPpHk/s400/android_sphere_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-7152694567586574022?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/7152694567586574022/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-primitivesphere.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7152694567586574022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7152694567586574022'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-primitivesphere.html' title='【教學】Android OpenGL ES Primitive_Sphere'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNQQSrHukDI/AAAAAAAAAZE/NrDC2q5rwBs/s72-c/android_sphere_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-3279367944693387452</id><published>2010-11-04T07:38:00.000-07:00</published><updated>2010-11-05T07:30:44.434-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES DrawEllipse</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫橢圓形的方法，&lt;br /&gt;圓形基本上也是由三角面形成，&lt;br /&gt;所以範例內橢圓及圓形是用GL_TRIANGLE_FAN，&lt;br /&gt;定義出各個頂點的位置資訊(不含顏色資訊)，&lt;br /&gt;再用glDrawArrays畫出三角面，&lt;br /&gt;專案為A3DEllipse，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNLF-hHEACI/AAAAAAAAAY8/vJPMnDgL6c8/s1600/android_ellipse_project.jpg"&gt;&lt;img style="WIDTH: 268px; HEIGHT: 396px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535704569822314530" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNLF-hHEACI/AAAAAAAAAY8/vJPMnDgL6c8/s400/android_ellipse_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DRender內新增drawEllipse方法，&lt;br /&gt;可分別給予長及寬的參數來決定形狀，&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.FloatBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); &lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);&lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST); &lt;br /&gt;    gl.glClearDepthf(1.0f);&lt;br /&gt;    gl.glDepthFunc(GL10.GL_LEQUAL);&lt;br /&gt;    gl.glEnable(GL10.GL_DEPTH_TEST);   &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport(0, 0, w, h);&lt;br /&gt;    float ratio;&lt;br /&gt;    ratio = (float)w/h;&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity();&lt;br /&gt;    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){  &lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); &lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODELVIEW);&lt;br /&gt;    gl.glLoadIdentity();  &lt;br /&gt;    GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);&lt;br /&gt;    gl.glFrontFace(GL10.GL_CCW);&lt;br /&gt;    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    //橢圓形&lt;br /&gt;    drawEllipse( gl, 32, 3.0f, 1.0f, 0.0f, -4.0f, 0.0f,true );&lt;br /&gt;    //圓形&lt;br /&gt;    drawEllipse( gl, 24, 1.5f, 1.5f, 0.0f, 3.0f, 0.0f,false );&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void drawEllipse(GL10 gl,int seg,float w,float h,float px,float py,float&lt;br /&gt;pz,boolean filled){&lt;br /&gt;    gl.glTranslatef(px, py, pz);&lt;br /&gt;    float vertices[];&lt;br /&gt;    vertices = new float[seg*2];&lt;br /&gt;    int count=0;&lt;br /&gt;    for(float i=0; i&lt;360.0f; i+=(360.0f/seg)){&lt;br /&gt;      vertices[count++] = (float)Math.cos( degressToRadian(i) )*w;&lt;br /&gt;      vertices[count++] = (float)Math.sin( degressToRadian(i) )*h; &lt;br /&gt;    }&lt;br /&gt;    gl.glVertexPointer( 2, GL10.GL_FLOAT, 0, getFloatBuffer(vertices));&lt;br /&gt;    gl.glDrawArrays((filled)?GL10.GL_TRIANGLE_FAN:GL10.GL_LINE_LOOP, 0, seg);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private double degressToRadian(float deg){&lt;br /&gt;    double rad = 0;&lt;br /&gt;    rad = (deg * Math.PI)/180.0f;&lt;br /&gt;    return rad;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private FloatBuffer getFloatBuffer(float[] table ){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect(table.length * 4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    FloatBuffer fb = bb.asFloatBuffer();&lt;br /&gt;    fb.put(table);&lt;br /&gt;    fb.position(0);&lt;br /&gt;    return fb;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNLF6N-craI/AAAAAAAAAY0/Bptg6g6PQgg/s1600/android_ellipse_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 284px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535704495966432674" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNLF6N-craI/AAAAAAAAAY0/Bptg6g6PQgg/s400/android_ellipse_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-3279367944693387452?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/3279367944693387452/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawellipse.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3279367944693387452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3279367944693387452'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawellipse.html' title='【教學】Android OpenGL ES DrawEllipse'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNLF-hHEACI/AAAAAAAAAY8/vJPMnDgL6c8/s72-c/android_ellipse_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-6452962565666781543</id><published>2010-11-03T09:35:00.000-07:00</published><updated>2010-11-03T09:49:37.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES DrawMesh</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫三角面的方法，&lt;br /&gt;在OpenGL裡畫三角面可用GL_TRIANGLES，&lt;br /&gt;而三角面是幾何模型的最基本的單位，&lt;br /&gt;任何複雜的模型都是由三角面形成，&lt;br /&gt;所以範例內四方形面是用GL_TRIANGLE_STRIP，&lt;br /&gt;定義出四個頂點的位置資訊，不含顏色資訊，&lt;br /&gt;再用glDrawArrays畫出兩個三角面，&lt;br /&gt;專案為A3DMesh，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TNGPoc3DNmI/AAAAAAAAAYk/nnEPvfVqhoc/s1600/android_mesh_project.jpg"&gt;&lt;img style="WIDTH: 258px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535363342119679586" border="0" alt="" src="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TNGPoc3DNmI/AAAAAAAAAYk/nnEPvfVqhoc/s400/android_mesh_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DRender內新增drawTriMesh，drawSquMesh方法，&lt;br /&gt;此方法只用簡單的頂點緩衝VertexBuffer，&lt;br /&gt;往後範例再介紹索引緩衝IndexBuffer，&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code" &gt;&lt;br /&gt;package com.max;&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.IntBuffer;&lt;br /&gt;import java.nio.FloatBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;&lt;br /&gt;  float triVtx[] = { -1.0f, -1.0f, 0, &lt;br /&gt;                      1.0f, -1.0f, 0,&lt;br /&gt;                      0.0f,  1.0f, 0 };&lt;br /&gt; &lt;br /&gt;  float squVtx[] = { -1.0f, 1.0f, 0,   &lt;br /&gt;                     -1.0f,-1.0f, 0,&lt;br /&gt;                      1.0f, 1.0f, 0,&lt;br /&gt;                      1.0f,-1.0f, 0 };&lt;br /&gt;               &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); &lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);&lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST);&lt;br /&gt;    gl.glClearDepthf(1.0f);&lt;br /&gt;    gl.glDepthFunc(GL10.GL_LEQUAL);&lt;br /&gt;    gl.glEnable(GL10.GL_DEPTH_TEST);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport(0, 0, w, h);&lt;br /&gt;    float ratio;&lt;br /&gt;    ratio = (float)w/h;&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIdentity();&lt;br /&gt;    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);&lt;br /&gt;    //GLU.gluOrtho2D(gl, 0.0f, w, h, 0.0f);  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){ &lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); &lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODELVIEW);&lt;br /&gt;    gl.glLoadIdentity(); &lt;br /&gt;    GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);&lt;br /&gt;    gl.glFrontFace(GL10.GL_CCW); //逆時針&lt;br /&gt;     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    drawTriMesh(gl, triVtx ); // 畫三角面 &lt;br /&gt;    drawSquMesh(gl, squVtx ); // 畫四角面  &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void drawTriMesh(GL10 gl,float[] vtx){ &lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, getFloatBuffer(vtx));&lt;br /&gt;    gl.glTranslatef(-2.0f, 0, 0);&lt;br /&gt;    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private void drawSquMesh(GL10 gl,float[] vtx){ &lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, getFloatBuffer(vtx));&lt;br /&gt;    gl.glTranslatef( 4.0f, 0, 0);&lt;br /&gt;    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  private FloatBuffer getFloatBuffer(float[] table ){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect(table.length * 4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    FloatBuffer fb = bb.asFloatBuffer();&lt;br /&gt;    fb.put(table);&lt;br /&gt;    fb.position(0);&lt;br /&gt;    return fb;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNGPtALqowI/AAAAAAAAAYs/hVUZ_U-3e5g/s1600/android_mesh_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 285px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535363420320867074" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNGPtALqowI/AAAAAAAAAYs/hVUZ_U-3e5g/s400/android_mesh_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-6452962565666781543?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/6452962565666781543/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawmesh.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6452962565666781543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6452962565666781543'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawmesh.html' title='【教學】Android OpenGL ES DrawMesh'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TNGPoc3DNmI/AAAAAAAAAYk/nnEPvfVqhoc/s72-c/android_mesh_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-7908034742730945547</id><published>2010-11-03T04:29:00.000-07:00</published><updated>2010-11-03T09:41:11.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES DrawLine</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫線段的方法，&lt;br /&gt;總共畫出兩種線，一種是線段，另一種是封閉線，&lt;br /&gt;線段可用GL_LINES，封閉線用GL_LINE_LOOP，&lt;br /&gt;畫線主要是定義出頂點的位置與顏色還有大小，&lt;br /&gt;有了頂點資訊再用glDrawArrays將其畫出，&lt;br /&gt;專案為A3DLine，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNFH0Ws-bzI/AAAAAAAAAYU/tWAJ_fMKPSQ/s1600/android_line_project.jpg"&gt;&lt;img style="WIDTH: 276px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535284381788041010" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNFH0Ws-bzI/AAAAAAAAAYU/tWAJ_fMKPSQ/s400/android_line_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DRender內新增drawLines，drawLineLoop與getIntBuffer方法，&lt;br /&gt;成像方面由透視改成正交模式，程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.IntBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;  &lt;br /&gt;  int one = 0x10000;&lt;br /&gt;  int lineVtPos1[] = { one*300, one*100, 0,&lt;br /&gt;                       one*100, one*400, 0 };&lt;br /&gt;  int lineColor1[] = { one, one, one, one,&lt;br /&gt;                       one, one, one, one };&lt;br /&gt;  int lineVtPos2[] = { one*300, one*100, 0, &lt;br /&gt;                       one*300, one*400, 0,&lt;br /&gt;                       one*100, one*400, 0,&lt;br /&gt;                       one*100, one*100, 0 };&lt;br /&gt;  int lineColor2[] = { one,   0,   0, one, &lt;br /&gt;                       one,   0, one, one,&lt;br /&gt;                         0, one, one, one,&lt;br /&gt;                         0, one,   0, one },&lt;br /&gt;                      &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor(0.0f,0.0f,0.0f,1.0f);//背景黑色&lt;br /&gt;    //gl.glShadeModel(GL10.GL_FLAT);      //原本單一色註解&lt;br /&gt;    gl.glShadeModel(GL10.GL_SMOOTH);      //平滑漸變色      &lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT,GL10.GL_FASTEST);&lt;br /&gt;    gl.glEnable(GL10.GL_LINE_SMOOTH);&lt;br /&gt;    gl.EnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    gl.EnableClientState(GL10.GL_COLOR_ARRAY);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport( 0, 0, w, h );&lt;br /&gt;    //float ratio;&lt;br /&gt;    //ratio = (float)w/h;&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIndentity();&lt;br /&gt;    //gl.glFrustumf(-ratio,ratio,-1,1,1,500);&lt;br /&gt;    GLU.gluOrtho2D(gl, 0.0f, w, h, 0.0f);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){&lt;br /&gt;    //gl.glClear(GL10.GL_COLOR_BUFFER_BIT);&lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODEVIEW);&lt;br /&gt;    gl.glLoadIndentity();&lt;br /&gt;    // 畫線段&lt;br /&gt;    drawLines( gl, lineVtPos1, lineColor1, 3.0f );&lt;br /&gt;    // 畫封閉線&lt;br /&gt;    drawLineLoop( gl, lineVtPos2, lineColor2, 4.0f );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void drawLines(GL10 gl, int[] vtx, int[] col, float siz){&lt;br /&gt;    gl.glLineWidth(siz);&lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FIXED, 0, getIntBuffer(vtx) );&lt;br /&gt;    gl.glColorPointer( 4, GL10.GL_FIXED, 0, getIntBuffer(col) );&lt;br /&gt;    gl.glDrawArrays(GL10.GL_LINES, 0, 2);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void drawLineLoop(GL10 gl, int[] vtx, int[] col, float siz){&lt;br /&gt;    gl.glLineWidth(siz);&lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FIXED, 0, getIntBuffer(vtx) );&lt;br /&gt;    gl.glColorPointer( 4, GL10.GL_FIXED, 0, getIntBuffer(col) );&lt;br /&gt;    gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private IntBuffer getIntBuffer(int[] table){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect( table.length*4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    IntBuffer ib = bb.asIntBuffer();&lt;br /&gt;    ib.put(table);&lt;br /&gt;    ib.position(0);&lt;br /&gt;    return ib;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNFH6Ha9rZI/AAAAAAAAAYc/9DU90MM3Wfo/s1600/android_line_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 284px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5535284480765177234" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TNFH6Ha9rZI/AAAAAAAAAYc/9DU90MM3Wfo/s400/android_line_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-7908034742730945547?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/7908034742730945547/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawline.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7908034742730945547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7908034742730945547'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawline.html' title='【教學】Android OpenGL ES DrawLine'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TNFH0Ws-bzI/AAAAAAAAAYU/tWAJ_fMKPSQ/s72-c/android_line_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-7496519011006864199</id><published>2010-11-02T05:16:00.000-07:00</published><updated>2010-11-03T04:37:33.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES DrawPoint</title><content type='html'>本範例是利用先前建立好的3D的基本框架，&lt;br /&gt;於A3DRender類別內增加畫頂點的方法，&lt;br /&gt;在OpenGL裡畫點是用GL_POINTS，&lt;br /&gt;定義出頂點的位置與顏色還有大小，&lt;br /&gt;有了頂點資訊再用glDrawArrays將其畫出，&lt;br /&gt;專案為A3DPoint，其A3DMain與A3DView內容不變，&lt;br /&gt;如下圖：&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNABa9YYe3I/AAAAAAAAAYE/PIl9Qu31RL8/s1600/project.jpg"&gt;&lt;img style="WIDTH: 261px; HEIGHT: 371px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5534925504703396722" border="0" alt="" src="http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNABa9YYe3I/AAAAAAAAAYE/PIl9Qu31RL8/s400/project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A3DRender內新增drawPoint與getIntBuffer方法，&lt;br /&gt;成像方面由透視改成正交模式，程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import android.opengl.GLU;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;import java.nio.ByteBuffer;&lt;br /&gt;import java.nio.ByteOrder;&lt;br /&gt;import java.nio.IntBuffer;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;  int one = 0x10000;&lt;br /&gt;  // 頂點座標X,Y,Z&lt;br /&gt;  int vertexArray[][] = { {one*120,one*200,0},&lt;br /&gt;                          {one*150,one*250,0},&lt;br /&gt;                          {one*200,one*150,0},&lt;br /&gt;                          {one*50,one*100,0},&lt;br /&gt;                          {one*250,one*50,0},&lt;br /&gt;                          {one*250,one*300,0} };&lt;br /&gt;  // 頂點顏色RGBA&lt;br /&gt;  int colorArray[][] = { {one,0,0,one}, &lt;br /&gt;                         {one,one,0,one},&lt;br /&gt;                         {one,0,one,one},&lt;br /&gt;                         {one,one,one,one},&lt;br /&gt;                         {0,one,one,one},&lt;br /&gt;                         {0,0,one,one} };&lt;br /&gt;  // 頂點大小&lt;br /&gt;  int sizeArray[] = {4,8,16,24,32,64};&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor( 0.0f, 1.0f, 0.0f, 1.0f);&lt;br /&gt;    gl.glShadeModel(GL10.GL_FLAT);&lt;br /&gt;    gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST);&lt;br /&gt;    gl.EnableClientState(GL10.GL_VERTEX_ARRAY);&lt;br /&gt;    gl.EnableClientState(GL10.GL_COLOR_ARRAY);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport( 0, 0, w, h );&lt;br /&gt;    gl.glMatrixMode(GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIndentity();&lt;br /&gt;    //float ratio;&lt;br /&gt;    //ratio = (float)w/h;&lt;br /&gt;    //gl.glFrustumf(-ratio,ratio,-1,1,1,500);&lt;br /&gt;    GLU.gluOrtho2D(gl, 0.0f, w, h, 0.0f);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){&lt;br /&gt;    //gl.glClear(GL10.GL_COLOR_BUFFER_BIT);&lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODEVIEW);&lt;br /&gt;    gl.glLoadIndentity();&lt;br /&gt;    int vtCount = vertexArray.length;&lt;br /&gt;    for(int i=0; i&lt;;vtCount i++){&lt;br /&gt;      drawPoint( gl, vertexArray[i], colorArray[i], sizeArray[i] );&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void drawPoint(GL10 gl, int[] vtx, int[] col, int siz){&lt;br /&gt;    gl.glPointSize(siz);&lt;br /&gt;    gl.glVertexPointer( 3, GL10.GL_FIXED, 0, getIntBuffer(vtx) );&lt;br /&gt;    gl.glColorPointer( 4, GL10.GL_FIXED, 0, getIntBuffer(col) );&lt;br /&gt;    gl.glDrawArrays(GL10.GL_POINTS, 0, 1);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private IntBuffer getIntBuffer(int[] table){&lt;br /&gt;    ByteBuffer bb = ByteBuffer.allocateDirect( table.length*4);&lt;br /&gt;    bb.order(ByteOrder.nativeOrder());&lt;br /&gt;    IntBuffer ib = bb.asIntBuffer();&lt;br /&gt;    ib.put(table);&lt;br /&gt;    ib.position(0);&lt;br /&gt;    return ib;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TNABi5oyyWI/AAAAAAAAAYM/kUTV8RGIkOw/s1600/result1.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 285px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5534925641137441122" border="0" alt="" src="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TNABi5oyyWI/AAAAAAAAAYM/kUTV8RGIkOw/s400/result1.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-7496519011006864199?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/7496519011006864199/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawpoint.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7496519011006864199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/7496519011006864199'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-drawpoint.html' title='【教學】Android OpenGL ES DrawPoint'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a8EDl0Lwf_Q/TNABa9YYe3I/AAAAAAAAAYE/PIl9Qu31RL8/s72-c/project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-4641244498204408295</id><published>2010-11-01T06:16:00.000-07:00</published><updated>2010-11-02T01:27:01.475-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android OpenGL ES 3D基本框架建立</title><content type='html'>本範例是在Android構建一個3D的基本框架，&lt;br /&gt;於src內自行新增兩個類別，如下圖：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TM6_z6pEfBI/AAAAAAAAAXc/X6iSRMlUdPo/s1600/A3DFramework_project.jpg"&gt;&lt;img style="WIDTH: 303px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5534571890720668690" border="0" alt="" src="http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TM6_z6pEfBI/AAAAAAAAAXc/X6iSRMlUdPo/s400/A3DFramework_project.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;建立流程：&lt;br /&gt;(1) 於Android Project中先建立一個渲染類別"A3DRender"&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max&lt;br /&gt;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import javax.microedition.khronos.egl.EGLConfig;&lt;br /&gt;import javax.microedition.khronos.opengles.GL10;&lt;br /&gt;&lt;br /&gt;public class A3DRender implements GLSurfaceView.Renderer{&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceCreated(GL10 gl,EGLConfig config){&lt;br /&gt;    gl.glClearColor( 0.0f, 1.0f, 0.0f, 1.0f);// 3D背景色rgba&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onSurfaceChanged(GL10 gl,int w,int h){&lt;br /&gt;    gl.glViewport( 0, 0, w, h );&lt;br /&gt;    gl.glMatrixMode( GL10.GL_PROJECTION);&lt;br /&gt;    gl.glLoadIndntity();&lt;br /&gt;    float ratio;&lt;br /&gt;    ratio = (float)w/h;&lt;br /&gt;    gl.glFrustumf(-ratio,ratio,-1,1,1,500);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onDrawFrame(GL10 gl){&lt;br /&gt;    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);&lt;br /&gt;    gl.glMatrixMode(GL10.GL_MODEVIEW);&lt;br /&gt;    gl.glLoadIndentity();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(2) 接下來是建立一個 A3DView類別，用來顯示OpenGL視圖&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.opengl.GLSurfaceView;&lt;br /&gt;import com.max.A3DRender;&lt;br /&gt;&lt;br /&gt;public class A3DView extends GLSurfaceView{&lt;br /&gt;&lt;br /&gt;  private A3DRender mA3DRender; &lt;br /&gt;&lt;br /&gt;  public A3DView(Context context){&lt;br /&gt;    super(context);&lt;br /&gt;    &lt;br /&gt;    mA3DRender = new A3DRender();&lt;br /&gt;    setRenderer(mA3DRender);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(3) 於主程式將A3DView加入其中，之後執行。&lt;br /&gt;程式碼如下：&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package com.max&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import com.max.A3DView;&lt;br /&gt;&lt;br /&gt;public class A3DMain extends Activity{&lt;br /&gt;  &lt;br /&gt;  private A3DView mA3DView;&lt;br /&gt;&lt;br /&gt;  public void onCreate(Bundle savedInstanceState){&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;    // setContentView(R.layout.main);&lt;br /&gt;    &lt;br /&gt;    mA3DView = new A3DView(this);&lt;br /&gt;    setContentView(mA3DView);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TM7AEaDtn_I/AAAAAAAAAXk/GgRSJtAh3qg/s1600/A3DFramework_result.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 285px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5534572174031822834" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/TM7AEaDtn_I/AAAAAAAAAXk/GgRSJtAh3qg/s400/A3DFramework_result.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-4641244498204408295?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/4641244498204408295/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4641244498204408295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4641244498204408295'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/11/android-opengl-es-3d.html' title='【教學】Android OpenGL ES 3D基本框架建立'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a8EDl0Lwf_Q/TM6_z6pEfBI/AAAAAAAAAXc/X6iSRMlUdPo/s72-c/A3DFramework_project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-1503332545849999674</id><published>2010-10-26T07:02:00.001-07:00</published><updated>2011-05-05T07:31:48.296-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PV3D'/><title type='text'>【教學】拖曳3D模型物件</title><content type='html'>&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;  import flash.events.Event;&lt;br /&gt;  import flash.events.MouseEvent;&lt;br /&gt;&lt;br /&gt;  import org.papervision3d.core.math.Number3D;&lt;br /&gt;  import org.papervision3d.core.math.Plane3D;&lt;br /&gt;  import org.papervision3d.core.geom.renderables.Vertex3D;&lt;br /&gt;  import org.papervision3d.objects.DisplayObject3D;&lt;br /&gt;  import org.papervision3d.view.BasicView;&lt;br /&gt;  import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;  import org.papervision3d.lights.PointLight3D;&lt;br /&gt;  import org.papervision3d.materials.shadematerials.PhongMaterial;&lt;br /&gt;  import org.papervision3d.objects.parsers.Max3DS;&lt;br /&gt;  import org.papervision3d.objects.primitives.Plane;&lt;br /&gt;  import org.papervision3d.events.FileLoadEvent;&lt;br /&gt;  import org.papervision3d.events.InteractiveScene3DEvent;&lt;br /&gt;  import org.papervision3d.render.QuadrantRenderEngine;&lt;br /&gt;&lt;br /&gt;  public class ModelDrag extends BasicView&lt;br /&gt;  {&lt;br /&gt;    private var planeMat:WireframeMaterial;&lt;br /&gt;    private var planeMod:Plane;&lt;br /&gt; &lt;br /&gt;    private var shaderlight:PointLight3D;&lt;br /&gt;    private var phongMat:PhongMaterial;&lt;br /&gt;    private var wireMat:WireframeMaterial;&lt;br /&gt; &lt;br /&gt;    private var max3dsMod:Max3DS;&lt;br /&gt;    private var teapotMod:DisplayObject3D;&lt;br /&gt; &lt;br /&gt;    private var planeToDragOn:Plane3D;&lt;br /&gt;    private var currentModel:DisplayObject3D;&lt;br /&gt;  &lt;br /&gt;    public function ModelDrag()&lt;br /&gt;    {&lt;br /&gt;      init3DObject();&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function init3DObject():void&lt;br /&gt;    {&lt;br /&gt;      planeMat = new WireframeMaterial(0x00FF00, 1, 0);&lt;br /&gt;      planeMod = new Plane(planeMat, 500, 500, 8, 8);&lt;br /&gt;      planeMod.localRotationX = -90;&lt;br /&gt;      scene.addChild(planeMod);&lt;br /&gt;  &lt;br /&gt;      max3dsMod = new Max3DS();&lt;br /&gt;      max3dsMod.load("Model.3DS");&lt;br /&gt;      max3dsMod.addEventListener( FileLoadEvent.LOAD_COMPLETE, onfileLoadHandle );&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function onfileLoadHandle(event:FileLoadEvent):void&lt;br /&gt;    {&lt;br /&gt;      viewport.opaqueBackground = 0x0;&lt;br /&gt;      viewport.interactive = true;&lt;br /&gt;  &lt;br /&gt;      max3dsMod.scale = 1;&lt;br /&gt;      var tmpMod:Max3DS = Max3DS(event.target);&lt;br /&gt;      scene.addChild(tmpMod);&lt;br /&gt;  &lt;br /&gt;      shaderlight = new PointLight3D(true);&lt;br /&gt;      shaderlight.position = new Number3D( -300, 300, -300 );&lt;br /&gt;      scene.addChild(shaderlight);&lt;br /&gt;      phongMat = new PhongMaterial( shaderlight, 0xFFFFFF, 0x555555, 100 );&lt;br /&gt;      phongMat.interactive = true;&lt;br /&gt;  &lt;br /&gt;      wireMat = new WireframeMaterial(0xFFFFFF, 1, 0);&lt;br /&gt;      wireMat.interactive = true;&lt;br /&gt;      teapotMod = tmpMod.getChildByName("Teapot");&lt;br /&gt;      teapotMod.material = phongMat;&lt;br /&gt;      teapotMod.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,teapotModPressHandler);&lt;br /&gt;  &lt;br /&gt;      stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);&lt;br /&gt;  &lt;br /&gt;      var up:Number3D = new Number3D(0, 1, 0);&lt;br /&gt;      planeToDragOn = new Plane3D(up, new Number3D(0,0,0));&lt;br /&gt;   &lt;br /&gt;      camera.y = 100;&lt;br /&gt;      camera.z = -200;&lt;br /&gt;&lt;br /&gt;      renderer = new QuadrantRenderEngine(QuadrantRenderEngine.CORRECT_Z_FILTER);&lt;br /&gt;      startRendering();&lt;br /&gt;    }&lt;br /&gt;            &lt;br /&gt;    private function teapotModPressHandler(event:InteractiveScene3DEvent):void&lt;br /&gt;    {&lt;br /&gt;      currentModel = event.displayObject3D as DisplayObject3D;&lt;br /&gt;      teapotMod.material = wireMat; &lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    private function mouseUpHandler(event:MouseEvent):void&lt;br /&gt;    {&lt;br /&gt;      currentModel = null;&lt;br /&gt;      teapotMod.material = phongMat;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    override protected function onRenderTick(event:Event = null):void&lt;br /&gt;    { &lt;br /&gt;      var ray:Number3D = camera.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);&lt;br /&gt;      ray = Number3D.add(ray, camera.position);&lt;br /&gt;&lt;br /&gt;      var cameraVertex3D:Vertex3D = new Vertex3D(camera.x, camera.y, camera.z);&lt;br /&gt;      var rayVertex3D:Vertex3D = new Vertex3D(ray.x, ray.y, ray.z);&lt;br /&gt;&lt;br /&gt;      var intersectPoint:Vertex3D = planeToDragOn.getIntersectionLine(cameraVertex3D, rayVertex3D);&lt;br /&gt;  &lt;br /&gt;      if(currentModel)&lt;br /&gt;      {&lt;br /&gt;        currentModel.x = intersectPoint.x;&lt;br /&gt;        currentModel.y = intersectPoint.y;&lt;br /&gt;        currentModel.z = intersectPoint.z;&lt;br /&gt;        viewport.buttonMode = true;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;        viewport.buttonMode = false;&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;      super.onRenderTick(event);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMbfj9-9S1I/AAAAAAAAAWk/bNrLsNc2BuI/s1600/demo.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 290px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5532355001298275154" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMbfj9-9S1I/AAAAAAAAAWk/bNrLsNc2BuI/s400/demo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_modeldrag/ModelDrag.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-1503332545849999674?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/1503332545849999674/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/10/3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/1503332545849999674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/1503332545849999674'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/10/3d.html' title='【教學】拖曳3D模型物件'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMbfj9-9S1I/AAAAAAAAAWk/bNrLsNc2BuI/s72-c/demo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-3211376065409066872</id><published>2010-10-25T07:50:00.000-07:00</published><updated>2010-10-25T08:29:47.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】在Windows 7 上安裝 Android 開發環境步驟</title><content type='html'>&lt;strong&gt;&lt;span style="font-family:verdana;"&gt;Step1:下載安裝JDK1.6 &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(1)連結 &lt;/span&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;&lt;span style="font-family:Verdana;"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Verdana;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;下載"jdk-6u22-windows-i586.exe"安裝執行檔.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(2)直接執行安裝檔,&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;安裝JDK至預設目錄&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(C:\Program Files\Java\jdk1.6.0_22\) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(3)在桌面"電腦"點擊滑鼠右鍵,選取"內容",再選取"進階系統設定",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;之後選"環境變數"找到"Path"變數名,點擊"編輯",&lt;/span&gt; &lt;span style="font-family:Verdana;"&gt;添加JDK的bin路徑&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(C:\Program Files\Java\jdk1.6.0_22\bin),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;完成後按"確定".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(4)於"系統變數"裡找到"CLASSPATH"變數名,&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;點擊"編輯",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;添加JDK的lib及demo路徑&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(C:\Program Files\Java\jdk1.6.0_22\lib)及&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(C:\Program Files\Java\jdk1.6.0_22\demo),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;完成後按"確定".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;(5)執行"CMD" "java -version",檢測JDK是否安裝成功.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Step2:下載安裝Eclipse&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;(1)登錄 http://www.eclipse.org/downloads/,&lt;br /&gt;選擇"Eclipse IDE for Java Developers"下載,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(2)直接下載壓縮包.eclipse-java-galileo-SR2-win32,&lt;br /&gt;解壓eclipse資料夾至C:\Program Files\.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Step3:下載安裝Android SDK&lt;br /&gt;&lt;/strong&gt;(1) 連結至http://developer.android.com/sdk/index.html,&lt;br /&gt;"選取"android-sdk-r07-windows.zip"下載,&lt;br /&gt;解壓縮下載好的SDK安裝包到要安裝的路徑(C:\Program Files\),&lt;br /&gt;執行"Setup.exe"安裝.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(2) "Android SDK and AVD Manager"窗口選"Settings",&lt;br /&gt;勾選完右下方點擊"Save &amp;amp; Apply",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(3) 重新執行"Setup.exe".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(4) 選"Available Packages"點擊"Install Selected"按鈕,安裝軟件包.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(5) 點擊"Accept All","Install Accepted"按鈕,開始下載安裝包 .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(6) 在桌面"電腦"點擊滑鼠右鍵,選取"內容",再選取"進階系統設定",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;之後選"系統變量" 找到"Path"變數名,點擊"編輯",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(Android SDK安裝文件下的tools文件夾路徑加入)&lt;br /&gt;(C:\Program Files\android-sdk-windows\tools),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;完成後按"確定".&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Step4:安裝ADT&lt;br /&gt;&lt;/strong&gt;(1) 開啟"Eclipse",點擊上方選單"Help",選擇"Software Update..."項&lt;br /&gt;和"Avaiable Software"選項,點擊"Add Site..."按鈕,&lt;br /&gt;輸入"https//dl-ssl.google.com/android/eclipse/".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;(2) 開啟選單"Windows",選擇"Preferences"-&gt;"Android",&lt;br /&gt;點擊"Browse"按鈕,選擇Android SDK的安裝路徑.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-3211376065409066872?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/3211376065409066872/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/10/windows-7-android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3211376065409066872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/3211376065409066872'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/10/windows-7-android.html' title='【教學】在Windows 7 上安裝 Android 開發環境步驟'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-6443297906150636187</id><published>2010-10-22T21:06:00.000-07:00</published><updated>2010-10-25T07:50:52.285-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>【教學】Android在Windows上開發環境</title><content type='html'>Android作業系統除了用來開發手機外，&lt;br /&gt;也可以開發其他嵌入式系統(Embedded System)。&lt;br /&gt;其應用程式的開發環境可以是Windos、Mac OS X 或Linux作業系統。&lt;br /&gt;&lt;br /&gt;下面介紹的是在Windos下開發Android所需的軟體開發包與工具：&lt;br /&gt;(1)JDK 1.6&lt;br /&gt;下載網址：&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(2)Eclipse Galileo(3.5)&lt;br /&gt;下載網址：&lt;a href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(3)Android SDK 2.2&lt;br /&gt;下載網址：&lt;a href="http://developer.android.com/sdk/index.html"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(4)ADT 0.9.7&lt;br /&gt;下載網址：&lt;a href="https://dl-ssl.google.com/android/eclipse/"&gt;https://dl-ssl.google.com/android/eclipse/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-6443297906150636187?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/6443297906150636187/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/10/androidwindows.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6443297906150636187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6443297906150636187'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/10/androidwindows.html' title='【教學】Android在Windows上開發環境'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-6317732780055986976</id><published>2010-10-21T07:23:00.000-07:00</published><updated>2011-05-05T07:32:55.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PV3D'/><title type='text'>【教學】InteractiveSceneManager &amp; Mouse3D</title><content type='html'>&lt;pre class="javascript" name="code"&gt;&lt;br /&gt;package &lt;br /&gt;{&lt;br /&gt;  import flash.events.Event;&lt;br /&gt;  import flash.text.TextField; &lt;br /&gt;    &lt;br /&gt;  import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;  import org.papervision3d.objects.primitives.Sphere;&lt;br /&gt;  import org.papervision3d.objects.primitives.Plane;&lt;br /&gt;  import org.papervision3d.view.BasicView;  &lt;br /&gt;    &lt;br /&gt;  import org.papervision3d.core.utils.Mouse3D;&lt;br /&gt;  import org.papervision3d.events.InteractiveScene3DEvent; &lt;br /&gt; &lt;br /&gt;  /**&lt;br /&gt;   * ...interactiveSceneManager &amp; Mouse3D&lt;br /&gt;   * @author Max&lt;br /&gt;   */&lt;br /&gt;  public class PV3D_Mouse3D_Demo extends BasicView &lt;br /&gt;  {&lt;br /&gt;    private var txt_mx:TextField;&lt;br /&gt;    private var txt_my:TextField;&lt;br /&gt;    private var txt_mz:TextField;&lt;br /&gt;    private var txt_author:tAuthortxt;  &lt;br /&gt;&lt;br /&gt;    private var planeMat:WireframeMaterial&lt;br /&gt;    private var planeMod:Plane;&lt;br /&gt;  &lt;br /&gt;    private var markMat:WireframeMaterial;&lt;br /&gt;    private var markMod:Sphere;&lt;br /&gt;  &lt;br /&gt;    private var m3D:Mouse3D;  &lt;br /&gt;  &lt;br /&gt;    public function PV3D_Mouse3D_Demo()&lt;br /&gt;    { &lt;br /&gt;      init3D();&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    private function init3D():void&lt;br /&gt;    {&lt;br /&gt;      viewport.opaqueBackground = 0x0;&lt;br /&gt;      viewport.interactive = true;&lt;br /&gt;   &lt;br /&gt;      txt_mx = new TextField();&lt;br /&gt;      txt_mx.textColor = 0xFFFFFF;&lt;br /&gt;      txt_mx.width = 200;&lt;br /&gt;      txt_mx.selectable = false;&lt;br /&gt;      txt_mx.x = 20;&lt;br /&gt;      txt_mx.y = 20;&lt;br /&gt;      viewport.addChild(txt_mx);&lt;br /&gt;   &lt;br /&gt;      txt_my = new TextField();&lt;br /&gt;      txt_my.textColor = 0xFFFFFF;&lt;br /&gt;      txt_my.width = 200;&lt;br /&gt;      txt_my.selectable = false;&lt;br /&gt;      txt_my.x = 20;&lt;br /&gt;      txt_my.y = 40;&lt;br /&gt;      viewport.addChild(txt_my);&lt;br /&gt;   &lt;br /&gt;      txt_mz = new TextField();&lt;br /&gt;      txt_mz.textColor = 0xFFFFFF;&lt;br /&gt;      txt_mz.width = 200;&lt;br /&gt;      txt_mz.selectable = false;&lt;br /&gt;      txt_mz.x = 20;&lt;br /&gt;      txt_mz.y = 60;&lt;br /&gt;      viewport.addChild(txt_mz);&lt;br /&gt;     &lt;br /&gt;      planeMat = new WireframeMaterial(0x00FF00, 1, 0);&lt;br /&gt;      planeMat.doubleSided = true;&lt;br /&gt;      planeMat.interactive = true;&lt;br /&gt;      planeMod = new Plane(planeMat, 1000, 1000, 6, 6);&lt;br /&gt;      scene.addChild(planeMod);&lt;br /&gt;    &lt;br /&gt;      markMat = new WireframeMaterial(0xFF0000, 1, 0);&lt;br /&gt;      markMat.doubleSided = true; &lt;br /&gt;      markMod = new Sphere(markMat, 15, 4, 3);&lt;br /&gt;      scene.addChild(markMod);  &lt;br /&gt;     &lt;br /&gt;      Mouse3D.enabled = true;&lt;br /&gt;      m3D = viewport.interactiveSceneManager.mouse3D;&lt;br /&gt;  &lt;br /&gt;      planeMod.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onPlaneModOver);&lt;br /&gt;      planeMod.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onPlaneModOut);&lt;br /&gt;   &lt;br /&gt;      startRendering();&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public function onPlaneModOver(event:InteractiveScene3DEvent):void&lt;br /&gt;    { &lt;br /&gt;      markMod.visible = true;&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public function onPlaneModOut(event:InteractiveScene3DEvent):void&lt;br /&gt;    {&lt;br /&gt;      markMod.visible = false;&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    override protected function onRenderTick(event:Event = null):void &lt;br /&gt;    {&lt;br /&gt;      txt_mx.text = "mx:" + m3D.x;&lt;br /&gt;      txt_my.text = "my:" + m3D.y;&lt;br /&gt;      txt_mz.text = "mz:" + m3D.z;&lt;br /&gt; &lt;br /&gt;      markMod.x = m3D.x;&lt;br /&gt;      markMod.y = m3D.y;&lt;br /&gt;      markMod.z = m3D.z;  &lt;br /&gt;       &lt;br /&gt;      planeMod.pitch(.2);&lt;br /&gt;      planeMod.yaw(.1);&lt;br /&gt;      planeMod.roll(.2);&lt;br /&gt;  &lt;br /&gt;      super.onRenderTick(event);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMBOPbaV6_I/AAAAAAAAAWc/OJgUNypvSp8/s1600/demo.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 303px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5530506369374219250" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMBOPbaV6_I/AAAAAAAAAWc/OJgUNypvSp8/s400/demo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_interactiveSceneManager/PV3D_Mouse3D_Demo.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-6317732780055986976?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/6317732780055986976/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/10/interactivescenemanager-mouse3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6317732780055986976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6317732780055986976'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/10/interactivescenemanager-mouse3d.html' title='【教學】InteractiveSceneManager &amp; Mouse3D'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a8EDl0Lwf_Q/TMBOPbaV6_I/AAAAAAAAAWc/OJgUNypvSp8/s72-c/demo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-4856962860730126022</id><published>2010-05-19T04:45:00.000-07:00</published><updated>2010-05-19T04:53:35.711-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PV3D'/><title type='text'>【作品】 PV3D 3D線段(Lines3D)測試</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/S_PQCiRxtLI/AAAAAAAAAS4/SXOAUoQDU2I/s1600/demo.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 315px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5472946714164966578" border="0" alt="" src="http://1.bp.blogspot.com/_a8EDl0Lwf_Q/S_PQCiRxtLI/AAAAAAAAAS4/SXOAUoQDU2I/s400/demo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://7-12.idv.tw/DeyingData/Flash/PV3D/demo_line3d/Lines3DExample.html" target="_blank"&gt;demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-4856962860730126022?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/4856962860730126022/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/05/pv3d-3dlines3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4856962860730126022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/4856962860730126022'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/05/pv3d-3dlines3d.html' title='【作品】 PV3D 3D線段(Lines3D)測試'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a8EDl0Lwf_Q/S_PQCiRxtLI/AAAAAAAAAS4/SXOAUoQDU2I/s72-c/demo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2200661281887379041.post-6636863114076387082</id><published>2010-05-14T05:17:00.000-07:00</published><updated>2011-05-05T07:33:33.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PV3D'/><title type='text'>【作品】 Jiglib &amp; papervision3d 碰撞測試</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/S-1AhxrAmcI/AAAAAAAAASw/wCZ3yzKFqPQ/s1600/demo.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 300px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5471100071338613186" border="0" alt="" src="http://3.bp.blogspot.com/_a8EDl0Lwf_Q/S-1AhxrAmcI/AAAAAAAAASw/wCZ3yzKFqPQ/s400/demo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://igmax.myweb.hinet.net/demo_bowling/Bowling_Demo.html" target="_blank"&gt;demo&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2200661281887379041-6636863114076387082?l=ig-max.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ig-max.blogspot.com/feeds/6636863114076387082/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://ig-max.blogspot.com/2010/05/jiglib-papervision3d.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6636863114076387082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2200661281887379041/posts/default/6636863114076387082'/><link rel='alternate' type='text/html' href='http://ig-max.blogspot.com/2010/05/jiglib-papervision3d.html' title='【作品】 Jiglib &amp; papervision3d 碰撞測試'/><author><name>Max</name><uri>http://www.blogger.com/profile/18109744422621874374</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/SmXvQCmXrTI/AAAAAAAAAQ4/X65YJy6GhVo/S220/%E5%A4%A7%E9%A0%AD1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_a8EDl0Lwf_Q/S-1AhxrAmcI/AAAAAAAAASw/wCZ3yzKFqPQ/s72-c/demo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
