<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>手機 App &#8211; 記下來</title>
	<atom:link href="https://noter.tw/code/app/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Wed, 22 Feb 2023 09:44:48 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>手機 App &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理</title>
		<link>https://noter.tw/6507/%e5%8d%87%e7%b4%9a-api-28-%e4%b9%8b%e5%be%8c%e5%99%b4%e5%87%ba%e7%9a%84%e5%85%a9%e5%80%8b-runtimeexception-%e8%99%95%e7%90%86/</link>
					<comments>https://noter.tw/6507/%e5%8d%87%e7%b4%9a-api-28-%e4%b9%8b%e5%be%8c%e5%99%b4%e5%87%ba%e7%9a%84%e5%85%a9%e5%80%8b-runtimeexception-%e8%99%95%e7%90%86/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sat, 16 Nov 2019 13:42:22 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[錯誤]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[java.lang.RuntimeException: Stub!]]></category>
		<category><![CDATA[FLAG_ACTIVITY_NEW_TASK]]></category>
		<category><![CDATA[startActivity()]]></category>
		<category><![CDATA[android.util.AndroidRuntimeException]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=6507</guid>

					<description><![CDATA[<p>小蛙在更新「我的股票精算師」的時候沒辦法上傳 apk 到 Play 商店，錯誤提示 targetSdkVersion 要從 26 提高到 28，小蛙照做之後，卻又得到這個錯誤「java.lang.Ru&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/6507/%e5%8d%87%e7%b4%9a-api-28-%e4%b9%8b%e5%be%8c%e5%99%b4%e5%87%ba%e7%9a%84%e5%85%a9%e5%80%8b-runtimeexception-%e8%99%95%e7%90%86/" data-wpel-link="internal">targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>小蛙在更新「我的股票精算師」的時候沒辦法上傳 apk 到 Play 商店，錯誤提示 targetSdkVersion 要從 26 提高到 28，小蛙照做之後，卻又得到這個錯誤「java.lang.RuntimeException: Stub!」及「android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?」，記錄一下解決方法。</p>



<span id="more-6507"></span>



<h2 class="para wp-block-heading">java.lang.RuntimeException: Stub!</h2>



<p>看 stacktrace 裡面是用到 HttpGet 這個 function，可能在 Android 9 之後拿掉了，因此報這個錯誤。解決的方法參考這篇：<a href="https://developer.android.com/about/versions/pie/android-9.0-changes-28" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Behavior changes: apps targeting API level 28+<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/qzh2CSts4UVD7pKzwgin-Byo5nLWGaGSjbh7YMgh_jD1Xl5botiL-rXcwFBD5aosLyB8me9Nhg2kx92ntv5pdYdOlYcYUzbcyYKNwLz8iSOukoRSksHvQANWfNCyZEhbiEX7nMOt2O1TIqIy1pcp4rGTCpGpBBb4N-AA-XaHGL3b4aQuiaUD9Nbqj-wyRGiPUkvrCNWc5UaltBcLf8VI4xPIy61dq-5gPLdLGm71ACsEiuhjcH_RDGlEowEEu_2wIDQkcW9usCIlTxibwGmZvz7XEEEukUvV8FvFfbZc3oOR2AASzFIakscArvqQ-VLprovUv9os1hGTqKKM9PGu4iBrqFc5ndmVacxqqAyGRH0HjmCUeWNDy8S4W0HxuZ81LEteQwxELQsnY5ADJ1i_xzUHvXZU9_dBqadrCjEA3g720rWsz-JgtUsWFn2QBijSOK2Di9HMH6r7gEWanqKUR3EYz0lRg5-H77Auol0Udncl8jYMfCJff1GC8k0LO1AWn-M_CvIoMSaL9OERGMfSmOdbXfHj07EtmZjdrJx8Gibcp_z-yU8AfMH-698DjyoxiVcH_zZQhLvvdF7mgsWJMmmYYkgCmn6FIjnRhqMwqUG_4Y672n48nrgCipHRhgDiMtQ_s8U21rj2bCDDqQ__jShcxicQSsKNl9_Olag42C0cW5EaBT6m9UkjvxRIKu_QxmbEPJaYmI0x8AqYt-j-iY1oroBCpFN8rRQ46ETZReyNcuTL=w884-h488-no" alt="qzh2CSts4UVD7pKzwgin Byo5nLWGaGSjbh7YMgh jD1Xl5botiL rXcwFBD5aosLyB8me9Nhg2kx92ntv5pdYdOlYcYUzbcyYKNwLz8iSOukoRSksHvQANWfNCyZEhbiEX7nMOt2O1TIqIy1pcp4rGTCpGpBBb4N AA XaHGL3b4aQuiaUD9Nbqj wyRGiPUkvrCNWc5UaltBcLf8VI4xPIy61dq 5gPLdLGm71ACsEiuhjcH RDGlEowEEu 2wIDQkcW9usCIlTxibwGmZvz7XEEEukUvV8FvFfbZc3oOR2AASzFIakscArvqQ VLprovUv9os1hGTqKKM9PGu4iBrqFc5ndmVacxqqAyGRH0HjmCUeWNDy8S4W0HxuZ81LEteQwxELQsnY5ADJ1i xzUHvXZU9 dBqadrCjEA3g720rWsz JgtUsWFn2QBijSOK2Di9HMH6r7gEWanqKUR3EYz0lRg5 H77Auol0Udncl8jYMfCJff1GC8k0LO1AWn M CvIoMSaL9OERGMfSmOdbXfHj07EtmZjdrJx8Gibcp z yU8AfMH 698DjyoxiVcH zZQhLvvdF7mgsWJMmmYYkgCmn6FIjnRhqMwqUG 4Y672n48nrgCipHRhgDiMtQ s8U21rj2bCDDqQ jShcxicQSsKNl9 Olag42C0cW5EaBT6m9UkjvxRIKu QxmbEPJaYmI0x8AqYt j iY1oroBCpFN8rRQ46ETZReyNcuTL=w884 h488 no targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理" title="targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理"></figure></div>



<p>根據官方文件，只要在 <mark class="yellow">AndroidManifest.xml</mark> 裡面加入</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">&lt;uses-library android:name="org.apache.http.legacy" android:required="false"/&gt;</pre>



<p>要加在哪裡呢？加在 &lt;application&gt; 的標籤下面就可以了</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">&lt;application&gt;
  ...
  &lt;uses-library android:name="org.apache.http.legacy" android:required="false"/&gt;
  ...
&lt;/application&gt;</pre>



<h2 class="para wp-block-heading">android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?</h2>



<p>這個問題呢是小蛙加入了 CustomTabsIntent 如果在 API 26 的時候編譯跟執行都沒有任何問題，更新到 API 28 之後一點就噴上面的錯誤，Google 了一下發現只要加入錯誤提示裡面的 flag 就可以了，修改的方式如下</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();        
// 只要加入這行就可以了
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
customTabsIntent.launchUrl(getApplicationContext(), Uri.parse(url));</pre>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/6507/%e5%8d%87%e7%b4%9a-api-28-%e4%b9%8b%e5%be%8c%e5%99%b4%e5%87%ba%e7%9a%84%e5%85%a9%e5%80%8b-runtimeexception-%e8%99%95%e7%90%86/" data-wpel-link="internal">targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/6507/%e5%8d%87%e7%b4%9a-api-28-%e4%b9%8b%e5%be%8c%e5%99%b4%e5%87%ba%e7%9a%84%e5%85%a9%e5%80%8b-runtimeexception-%e8%99%95%e7%90%86/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Windows 8.1 Flutter 開發環境安裝</title>
		<link>https://noter.tw/284/windows-8-1-flutter-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e5%ae%89%e8%a3%9d/</link>
					<comments>https://noter.tw/284/windows-8-1-flutter-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e5%ae%89%e8%a3%9d/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sat, 23 Jun 2018 05:35:14 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[flutter]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[dart]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=284</guid>

					<description><![CDATA[<p>Flutter 超威猛的出現，可參考這篇 Google發表可同時支援Android與iOS的行動UI框架Flutter &#124; iThome，survey 一些文章之後，發現原本正在學習 React Na&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/284/windows-8-1-flutter-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e5%ae%89%e8%a3%9d/" data-wpel-link="internal">Windows 8.1 Flutter 開發環境安裝</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>Flutter 超威猛的出現，可參考這篇 <a href="https://www.ithome.com.tw/news/121546" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Google發表可同時支援Android與iOS的行動UI框架Flutter | iThome<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，survey 一些文章之後，發現原本正在學習 React Native 的小蛙，眼睛為之一亮，二話不說立馬來學，之前裝在 Mac 環境上時來不及記錄，這裡把 Windows 環境下的安裝過程記錄下來。</p>
<p><span id="more-284"></span></p>
<p>開始之前先看一下系統需求</p>
<h2 class="para">安裝需求</h2>
<ol class="my-li bg-darkblue">
<li>Windows 7.1 SP1 以上 (64 位元)</li>
<li>剩餘硬碟空間 400GB 以上 (不包含 IDE)</li>
</ol>
<ol class="my-li bg-darkblue">
<li>其他必要工具：<a href="https://docs.microsoft.com/en-us/powershell/scripting/setup/installing-windows-powershell#upgrading-existing-windows-powershell" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">PowerShell 5.0<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 以上、<a href="https://git-scm.com/download/win" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Git for Windows<span class="wpel-icon wpel-image wpel-icon-6"></span></a> (開啟&nbsp;Use Git from the Windows Command Prompt)</li>
</ol>
<p>PowerShell 點進上述連結後，找適合自己的版本，例如小蛙選了 Windows 8.1 這一行的 WMF 5.1，進入點選 Download 後出現「Choose the download you want」這裡只要勾選最下面兩個 win8.1 開頭的下載就好。</p>
<h2 class="para">下載 Flutter SDK</h2>
<ol class="my-li bg-darkblue">
<li>到 <a href="https://flutter.io/get-started/install/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Flutter 官網<span class="wpel-icon wpel-image wpel-icon-6"></span></a>或是 <a href="https://storage.googleapis.com/flutter_infra/releases/beta/windows/flutter_windows_v0.5.1-beta.zip" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">flutter_windows_v0.5.1-beta.zip<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載。</li>
<li>解壓縮後，建議放在 C:\flutter\ 或是自己建立的資料夾，盡可能不要放在&nbsp;C:\Program Files\</li>
<li>點兩下 C:\flutter\flutter_console.bat 就可以開啟 flutter console</li>
</ol>
<h2 class="para">設定 path 參數</h2>
<ol class="my-li bg-darkblue">
<li>開啟「控制台」-&gt; 找到「使用者帳戶」-&gt; 左側「變更我的環境變數」</li>
<li>找到 使用者變數 PATH，點兩下或按編輯進行修改</li>
<li>如果原本已經有東西了，請用半形的分號「;」做分隔，加入 flutter/bin 安裝路徑，例如小蛙的環境 XXXXXX;c:\flutter\bin</li>
</ol>
<h2 class="para">使用 Flutter Doctor 檢測環境</h2>
<p>如果上面的環境有設定好的話，直接在 flutter console 下 flutter doctor 就會開始進行檢測</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3988" src="https://noter.tw/wp-content/uploads/2018/06/Image-1.png" alt="Image 1 Windows 8.1 Flutter 開發環境安裝" width="803" height="261" title="Windows 8.1 Flutter 開發環境安裝"></p>
<p>接著要來處理驚嘆號跟 X 的部份，上圖看起來有三個</p>
<ol class="my-li bg-darkblue">
<li>Android toolchain &#8211; develop for Android devices (Android SDK 27.0.3)<br />
Some Android licenses not accepted. To resolve this, run: flutter doctor &#8211;android-licenses</li>
<li>Flutter plugin not installed; this adds Flutter specific functionality.</li>
<li>Dart plugin not installed; this adds Dart specific functionality.</li>
<li>No devices available.</li>
</ol>
<p>第一點是要接受 android license，只要下 flutter doctor &#8211;android-license 跳出的所有問題都按 Y 就可以了。</p>
<p>第二點跟第三點都是要安裝 Plugin，開啟 Android Studio，因為小蛙原本就有 Android Studio 了，這邊就不說安裝過程了，有需要的人請服用 <a href="https://developer.android.com/studio/#downloads" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Download Android Studio and SDK Tools | Android Developers<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，File -&gt; Settings -&gt; Plugins -&gt; 搜尋 Flutter 後點選 Search in repositories -&gt; 找到 Flutter 點選 Install。(Dart 也是一樣)</p>
<p>第四點可以連接實體的 Android 或是開啟 Android Studio 並啟動一個模擬器，這邊使用模擬器當例子，開啟 Android Studio -&gt; Tools -&gt; AVD Manager -&gt; +Create Virtual Devices&#8230; -&gt; 隨便選擇一個型號的 Phone -&gt; Next &#8211; &gt; 安裝缺少的 SDK 版本 -&gt; Next 寫名字 -&gt; Finish，這樣就可以啟動模擬器了。</p>
<p>處理好了再執行一次 flutter doctor，看到「No issues found!」就完成囉！</p>
<p><img decoding="async" class="aligncenter size-full wp-image-3989" src="https://noter.tw/wp-content/uploads/2018/06/Image-4.png" alt="Image 4 Windows 8.1 Flutter 開發環境安裝" width="801" height="173" title="Windows 8.1 Flutter 開發環境安裝"></p>
<p>基本開發環境大致上這樣就可以用了，接下來就開始學習怎麼用 Dart 來寫 Flutter 吧！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/284/windows-8-1-flutter-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e5%ae%89%e8%a3%9d/" data-wpel-link="internal">Windows 8.1 Flutter 開發環境安裝</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/284/windows-8-1-flutter-%e9%96%8b%e7%99%bc%e7%92%b0%e5%a2%83%e5%ae%89%e8%a3%9d/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</title>
		<link>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/</link>
					<comments>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 03:24:19 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[multitarget]]></category>
		<category><![CDATA[多重模型]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3739</guid>

					<description><![CDATA[<p>要進到這系列最後一篇文章了，這篇文章拖了很久，一直沒有時間整理，結果到最後 &#8230; 程式碼留下來了，記憶卻有些模糊了，這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。 設計自己的物件 因為這邊&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>要進到這系列最後一篇文章了，這篇文章拖了很久，一直沒有時間整理，結果到最後 &#8230; 程式碼留下來了，記憶卻有些模糊了，這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。 </p>



<span id="more-3739"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/blank-e-box-for-software-etc-4-1238246-1280x960.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/blank-e-box-for-software-etc-4-1238246-1280x960-500x375.jpg" alt="圖片來源：http://tw.freeimages.com/photo/blank-e-box-for-software-etc-4-1238246" class="wp-image-3753" title="Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/blank-e-box-for-software-etc-4-1238246</figcaption></figure></div>


<h2 class="para">設計自己的物件</h2>
<p>因為這邊要載入多個模型，而每個模型搭配的參數都不同，例如：刀鋒戰士要放大 10 倍並且往 y 軸位移 50、茶壺要 blablabla &#8230;，這邊可以根據自己的需求去做設計，小蛙隨意列了幾個可能會隨著不同模型調整的屬性</p>
<div>
<div id="highlighter_408527" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">class</code> <code class="java plain">MyObjs {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String symbol;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String obj;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String mtl;</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">List&lt;String&gt; textures;</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">scale = </code><code class="java value">1</code><code class="java plain">;</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">postScale = </code><code class="java value">1</code><code class="java plain">;</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 0 度躺著正面朝上</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateZ = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateZ = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">Object3D target;</code></div>
<div class="line number16 index15 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>有看不懂的可以往前翻，屬性也不一一介紹了。</p>
<h2 class="para">初始化物件</h2>
<p>初始化這些物件，將每個要載入的物件及他的參數一一創建出來，</p>
<div>
<div id="highlighter_543699" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java comments">// 要觸發的圖片(ImageTarget)</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">private</code> <code class="java keyword">static</code> <code class="java plain">List&lt;String&gt; SYMBOL = </code><code class="java keyword">new</code> <code class="java plain">ArrayList&lt;&gt;();</code></div>
<div class="line number3 index2 alt2"><code class="java comments">// 要呈現出來的 3D 模型</code></div>
<div class="line number4 index3 alt1"><code class="java keyword">private</code> <code class="java plain">List&lt;MyObjs&gt; objs = </code><code class="java keyword">new</code> <code class="java plain">ArrayList();</code></div>
<div class="line number5 index4 alt2"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">initObjs(){</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SYMBOL = Arrays.asList(</code><code class="java string">"stones"</code><code class="java plain">, </code><code class="java string">"chips"</code><code class="java plain">, </code><code class="java string">"tarmac"</code><code class="java plain">);</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 木頭櫃子</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.symbol = SYMBOL.get(</code><code class="java value">0</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.mtl = </code><code class="java string">"Bedside_Table_D.mtl"</code><code class="java plain">;</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.obj = </code><code class="java string">"Bedside Table D.obj"</code><code class="java plain">;</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.textures = Arrays.asList(</code><code class="java string">"Bedside_Table_D_default_1_1.png"</code><code class="java plain">);</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.scale = </code><code class="java value">5</code><code class="java plain">;</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.traslateX = -</code><code class="java value">110</code><code class="java plain">;</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.traslateY = -</code><code class="java value">160</code><code class="java plain">;</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(m);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 灰色櫃子</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs w = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.symbol = SYMBOL.get(</code><code class="java value">2</code><code class="java plain">);</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.mtl = </code><code class="java string">"Bedside_Table_B.mtl"</code><code class="java plain">;</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.obj = </code><code class="java string">"Bedside Table B.obj"</code><code class="java plain">;</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.textures = Arrays.asList(</code><code class="java string">"Bedside_Table_B_default_1_1.png"</code><code class="java plain">);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.scale = </code><code class="java value">5</code><code class="java plain">;</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.traslateX = -</code><code class="java value">110</code><code class="java plain">;</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.traslateY = -</code><code class="java value">160</code><code class="java plain">;</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(w);</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 木桶</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs n = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.symbol = SYMBOL.get(</code><code class="java value">1</code><code class="java plain">);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.mtl = </code><code class="java string">"MedievalBarrel_OBJ.mtl"</code><code class="java plain">;</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.obj = </code><code class="java string">"MedievalBarrel_OBJ.obj"</code><code class="java plain">;</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.textures = Arrays.asList(</code><code class="java string">"MedBarrelDiffuse.jpg"</code><code class="java plain">, </code><code class="java string">"MedBarrelNormal.jpg"</code><code class="java plain">);</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.scale = </code><code class="java value">20</code><code class="java plain">;</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.traslateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.traslateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(n);</code></div>
<div class="line number40 index39 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>在載入 obj 的範例中我們知道需要同時載入 mtl 搭配 textures，不然載進來的模型沒有材質貼圖。上面的例子中將屬性一一設定好，並且加入 objs 中，我們透過 m.symbol 來得知當出現哪張影像的時候，載入這個模型 (m.mtl, m.obj, m.textures)， 並可設定縮放(scale)、翻轉(rotate)以及位移(traslate)，這邊可以自己把自己要設定的屬性加上去。</p>
<h2 class="para">載入物件</h2>
<p>當把所有的物件都設定好之後，在 ImageTargetRenderer 建構子中載入這些物件們</p>
<div>
<div id="highlighter_550427" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java plain">... 以上省略 ...</code></div>
<div class="line number2 index1 alt1"><code class="java plain">initObjs();</code></div>
<div class="line number3 index2 alt2"><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">i = </code><code class="java value">0</code><code class="java plain">; i &lt; objs.size(); i++){</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = objs.get(i);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">j = </code><code class="java value">0</code><code class="java plain">; j &lt; m.textures.size(); j++){</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.textures.get(j),</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(TXT_PATH + m.textures.get(j)))</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Object3D[] tmp = Loader.loadOBJ(</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity.getAssets().open(OBJ_PATH + m.obj),</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java string">""</code><code class="java plain">.equals(m.mtl) ? </code><code class="java keyword">null</code> <code class="java plain">: mActivity.getAssets().open(MTL_PATH + m.mtl),</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.scale</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(tmp != </code><code class="java keyword">null</code> <code class="java plain">&amp;&amp; tmp.length &gt;= </code><code class="java value">1</code><code class="java plain">){</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target = tmp[</code><code class="java value">0</code><code class="java plain">];</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.strip();</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.build();</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateX != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateX(m.rotateX);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateY != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateY(m.rotateY);</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateZ != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateY(m.rotateZ);</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.traslateX != </code><code class="java value">0</code> <code class="java plain">|| m.traslateY != </code><code class="java value">0</code> <code class="java plain">|| m.traslateZ != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.translate(m.traslateX, m.traslateY, m.traslateZ);</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.postScale != </code><code class="java value">1</code><code class="java plain">)</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.scale(m.postScale);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(</code><code class="java string">""</code><code class="java plain">.equals(m.mtl)) {</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">z = </code><code class="java value">0</code><code class="java plain">; z &lt; m.textures.size(); z++)</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.setTexture(m.textures.get(z));</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(m.target);</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(m.target.getTransformedCenter());</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number42 index41 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number43 index42 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number44 index43 alt1"><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number45 index44 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number46 index45 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>將 objs 中的 MyObj 一一取出，並設定該物件之屬性，到這個階段，就可以依照不同影像載入不同模型，但，這還不夠。</p>
<h2 class="para">移除模型</h2>
<p>剩最後一個步驟，到上一個步驟會發現每個 render 出來的模型，他不會消失 &#8230; 不會消失 &#8230; 不會消失 &#8230; 加上這個步驟讓他消失吧！</p>
<div>
<div id="highlighter_563479" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java comments">// The render function.</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">renderFrame() {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// clear color and depth buffer</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// get the state, and mark the beginning of a rendering section</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">State state = mRenderer.begin();</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// explicitly render the video background</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mRenderer.drawVideoBackground();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">float</code><code class="java plain">[] modelviewArray = </code><code class="java keyword">new</code> <code class="java keyword">float</code><code class="java plain">[</code><code class="java value">16</code><code class="java plain">];</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// did we find any trackables this frame?</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code> <code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">tIdx = </code><code class="java value">0</code><code class="java plain">; tIdx &lt; state.getNumTrackableResults(); tIdx++) {</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// get the trackable</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TrackableResult result = state.getTrackableResult(tIdx);</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Trackable trackable = result.getTrackable();</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">printUserData(trackable);</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F modelViewMatrix = Tool.convertPose2GLMatrix(result.getPose());</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F inverseMV = SampleMath.Matrix44FInverse(modelViewMatrix);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F invTranspMV = SampleMath.Matrix44FTranspose(inverseMV);</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{world.removeAllObjects();}</code><code class="java keyword">catch</code> <code class="java plain">(Exception e){}</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">i = </code><code class="java value">0</code><code class="java plain">; i &lt; objs.size(); i++){</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = objs.get(i);</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.symbol.equals(trackable.getName())){</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(m.target);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(m.target.getTransformedCenter());</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">modelviewArray = invTranspMV.getData();</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">updateModelviewMatrix(modelviewArray);</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// hide the objects when the targets are not detected</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code> <code class="java plain">(state.getNumTrackableResults() == </code><code class="java value">0</code><code class="java plain">) {</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">float</code> <code class="java plain">m [] = {</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,-</code><code class="java value">10000</code><code class="java plain">,</code><code class="java value">1</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">};</code></div>
<div class="line number42 index41 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">modelviewArray = m;</code></div>
<div class="line number43 index42 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">updateModelviewMatrix(modelviewArray);</code></div>
<div class="line number44 index43 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number45 index44 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mRenderer.end();</code></div>
<div class="line number46 index45 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>這個 function 小蛙已經忘記哪些是小蛙自己加的，哪些是原本的 code 了，就整個附上來試試看吧！<br>小蛙之前也遇過有網友詢問動畫的部份，經過這一段時間的研究發現 &#8230; 如果真的要用到會動的 3D model，就直接使用 Unity 吧！畢竟在 native code 中要讓做到動畫真的太麻煩了 &gt;&lt; 之前 survey 了好久，因為變數太大、複雜度也太高，直接放棄轉向 render 動畫原本就是強項的 Unity。祝各位好運囉！</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</title>
		<link>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 02:24:33 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[texture]]></category>
		<category><![CDATA[loader]]></category>
		<category><![CDATA[3ds]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3737</guid>

					<description><![CDATA[<p>延續 jPCT-AE Loader 載入模型的部份，這篇要記錄載入 3ds 檔案格式的方法，基本上跟前面幾個 obj, md2 的方法差不多，只有一些小小的變化而已。 下載需要的檔案 到 這裡 下載需&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>延續 jPCT-AE Loader 載入模型的部份，這篇要記錄載入 3ds 檔案格式的方法，基本上跟前面幾個 obj, md2 的方法差不多，只有一些小小的變化而已。</p>



<span id="more-3737"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3d-glasses-1424688.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/3d-glasses-1424688-500x275.jpg" alt="圖片來源：http://tw.freeimages.com/photo/3d-glasses-1424688" class="wp-image-3754" title="Android Vuforia with jPCT-AE (4) – 載入 3DS 測試"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/3d-glasses-1424688</figcaption></figure></div>


<h2 class="para">下載需要的檔案</h2>
<p>到 <a href="http://tf3dm.com/search/?q=barrel&amp;format=All+Formats&amp;search=Search" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載需要的檔案，要注意的是找有 3ds 格式的以及下載下來之後，texture 的圖片大小一定要是 2 的次方，否則載入 texture 的時候會出現錯誤。選桶子的原因是 texture 較為簡單，先試成功一個之後，再去載入複雜一點的模型。</p>
<h2 class="para">載入 3DS 模型</h2>
<p>附上載入程式碼，基本上沒有什麼不同，差別只有在於需不需要設定 texture，例如：載入 obj 跟 mtl 的時候，由於 mtl 已經有 texture 資訊，因此不需要呼叫 setTexture 方法，而 3DS 需要加入此方法，否則會看到赤裸裸的模型。另外有些模型太小，不放大會看不到 (就小小的)，但是放大之後偏差跟位移也會明顯放大，各位可以試試看 &#8230;</p>
<div>
<div id="highlighter_959124" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java plain">ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity = activity;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">vuforiaAppSession = session;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world = </code><code class="java keyword">new</code> <code class="java plain">World();</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setAmbientLight(</code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// set the following value according to your need, so the object won't be disappeared.</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setClippingPlanes(</code><code class="java value">2</code><code class="java plain">.0f, </code><code class="java value">3000</code><code class="java plain">.0f);</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun = </code><code class="java keyword">new</code> <code class="java plain">Light(world);</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setIntensity(</code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入 texture 並且取名為 ton2.jpg，之後可以直接用 setTexture(name) 來設定 texture</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code><code class="java string">"ton2.jpg"</code><code class="java plain">,</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(</code><code class="java string">"ton2.jpg"</code><code class="java plain">))</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入 3ds 模型，放大 100 倍</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Object3D[] tmp = Loader.load3DS(mActivity.getAssets().open(</code><code class="java string">"ton3_low.3ds"</code><code class="java plain">), </code><code class="java value">100</code><code class="java plain">);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(tmp != </code><code class="java keyword">null</code> <code class="java plain">&amp;&amp; tmp.length &gt;= </code><code class="java value">1</code><code class="java plain">){</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder = tmp[</code><code class="java value">0</code><code class="java plain">];</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code> <code class="java plain">(Exception e) {</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.strip();</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.build();</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 讓桶子躺下</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.rotateX(</code><code class="java value">1</code><code class="java plain">.5f);</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 設定 texture，讓桶子有衣服穿 XD</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.setTexture(</code><code class="java string">"ton2.jpg"</code><code class="java plain">);</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.translate(</code><code class="java value">0</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">);</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(cylinder);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(cylinder.getTransformedCenter());</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MemoryHelper.compact();</code></div>
<div class="line number42 index41 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h2 class="para">結果</h2>
<div id="attachment_3759" style="width: 310px" class="wp-caption aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3ds.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" aria-describedby="caption-attachment-3759" class=" wp-image-3759 " src="https://sshfs.crazyall.net/wazai/2016/07/3ds-500x569.png" alt="載入 3ds 測試" width="300" height="341" title="Android Vuforia with jPCT-AE (4) – 載入 3DS 測試"></a><p id="caption-attachment-3759" class="wp-caption-text">載入 3ds 測試</p></div>
<p>Loader 部份文章就到這邊，下一篇將記錄如何遇到不同 image target 的時候可以動態載入不同的模型。</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="TF3DM (在新分頁中開啟)" href="http://tf3dm.com/" target="_blank" data-wpel-link="external" class="wpel-icon-right">TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (3) – 載入 md2 測試</title>
		<link>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 01:24:43 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[loader]]></category>
		<category><![CDATA[md2]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3735</guid>

					<description><![CDATA[<p>前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案，這邊繼續介紹 jPCT-AE 載入 md2 的方法，載入動作大致上類似，唯一不同的只有 texture 設定部份。 囉哩巴唆 &#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案，這邊繼續介紹 jPCT-AE 載入 md2 的方法，載入動作大致上類似，唯一不同的只有 texture 設定部份。 </p>



<span id="more-3735"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3d-maze-2-1208096.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/3d-maze-2-1208096-500x375.jpg" alt="圖片來源：http://tw.freeimages.com/photo/3d-maze-2-1208096" class="wp-image-3752" title="Android Vuforia with jPCT-AE (3) – 載入 md2 測試"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/3d-maze-2-1208096</figcaption></figure></div>


<h2 class="para">囉哩巴唆</h2>
<p>這次沒有什麼好囉哩巴唆了，小蛙對於這些 3D model 的檔案類型是一知半解，只是看到 jPCT-AE 有這幾種 loader，一個一個測試過後把程式碼留下來。</p>
<h2 class="para">下載需要的檔案</h2>
<p>找了半天，要找到 md2 檔案真是有點困難，後來終於在 <a title="Enseignement C++ avancé en Master Informatique" href="https://www.lri.fr/~pa/progcxx.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 找到可以下載的 md2 模型。</p>
<h2 class="para">載入 md2 模型</h2>
<p>附上以下程式碼</p>
<div>
<div id="highlighter_380268" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java plain">ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity = activity;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">vuforiaAppSession = session;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world = </code><code class="java keyword">new</code> <code class="java plain">World();</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setAmbientLight(</code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// set the following value according to your need, so the object won't be disappeared.</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setClippingPlanes(</code><code class="java value">2</code><code class="java plain">.0f, </code><code class="java value">3000</code><code class="java plain">.0f);</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun = </code><code class="java keyword">new</code> <code class="java plain">Light(world);</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setIntensity(</code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// loadMD2(檔案, 縮放);</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder = Loader.loadMD2(mActivity.getAssets().open(</code><code class="java string">"Blade.md2"</code><code class="java plain">), </code><code class="java value">10</code><code class="java plain">);</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入材質，材質名稱直接設定為檔案名稱，也可以修改</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code><code class="java string">"Blade.jpg"</code><code class="java plain">,</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(</code><code class="java string">"Blade.jpg"</code><code class="java plain">)));</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 設定使用名為 Blade.jpg 的材質 (就是上面設定的名字)</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.setTexture(</code><code class="java string">"Blade.jpg"</code><code class="java plain">);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.strip();</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.build();</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// X 軸方向翻轉</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.rotateX(</code><code class="java value">1</code><code class="java plain">.5f);</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 位移 x, y, z</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.translate(-</code><code class="java value">100</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">, -</code><code class="java value">200</code><code class="java plain">);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(cylinder);</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(cylinder.getTransformedCenter());</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MemoryHelper.compact();</code></div>
<div class="line number35 index34 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>快點試試看，是不是能如下圖載入刀鋒戰士呢？</p>
<div id="attachment_3763" style="width: 310px" class="wp-caption aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/md2.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" aria-describedby="caption-attachment-3763" class=" wp-image-3763 " src="https://sshfs.crazyall.net/wazai/2016/07/md2-500x632.png" alt="載入 md2 測試" width="300" height="379" title="Android Vuforia with jPCT-AE (3) – 載入 md2 測試"></a><p id="caption-attachment-3763" class="wp-caption-text">載入 md2 測試</p></div>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="Enseignement C++ avancé en Master Informatique (在新分頁中開啟)" href="https://www.lri.fr/~pa/progcxx.html" target="_blank" data-wpel-link="external" class="wpel-icon-right">Enseignement C++ avancé en Master Informatique<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (2) – 載入 obj 測試</title>
		<link>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 00:24:55 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[.obj]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[mtl]]></category>
		<category><![CDATA[texture]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3688</guid>

					<description><![CDATA[<p>上一篇&#160;Android Vuforia with jPCT-AE (1) – 基本範例 我們已經把 Vuforia 與 jPCT-AE 的環境建立出來，也可以正常顯示 Vuforia + j&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>上一篇&nbsp;<a rel="noreferrer noopener" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" target="_blank" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a> 我們已經把 Vuforia 與 jPCT-AE 的環境建立出來，也可以正常顯示 Vuforia + jPCT-AE 的範例─一個顏色有點昏暗的桶子，這篇繼續記錄怎麼直接載入一般常見的 .obj 檔案。 </p>



<span id="more-3688"></span>



<h2 class="para wp-block-heading">囉哩巴唆</h2>



<p>透過 <a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a> 是直接在 ImageTargetRenderer.java 的建構式中，將要畫出物件的座標以及一些參數設定好之後，透過 jPCT-AE 畫出來，聽起來不怎麼有彈性，加上一些複雜的模型要透過自己訂定座標點的方式畫出來，貌似非常不科學啊！因此，這篇要記錄如何透過 Loader 類別來載入 .obj 的檔案，而不是在程式中，自己把座標一一描繪出來。</p>



<h2 class="para wp-block-heading">到 TD3M 下載需要的檔案</h2>



<p>這篇小蛙使用&nbsp;<a href="http://tf3dm.com/3d-model/bedside-table-4-skins-96709.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Bedside Table (4 skins) @ TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 當作範例，因為這個範例非常符合 jPCT-AE 載入的規則，後面會再提到這是什麼意思，總之先把這個範例下載下來，下載完解壓縮之後會看到如下圖</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/table.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/table.png" alt="Bedside table 3d model" class="wp-image-3732" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>Bedside table 3d model</figcaption></figure></div>



<p>將這三個檔案通通複製到 Android Studio 專案中的 assets 目錄下</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/as_project.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/as_project.png" alt="將模型放入 assets 目錄下" class="wp-image-3731" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>將模型放入 assets 目錄下</figcaption></figure></div>



<p>小蛙測試的時候用了很多模型，造成 assets 目錄下面亂七八糟，因此又在 assets 下新增了 obj、mtl、texture 等目錄，分別把上述「Bedside Table D.obj」、「Bedside_Table_D.mtl」、「Bedside_Table_D_default_1_1.png」依類別放入。</p>



<h2 class="para wp-block-heading">讓 jPCT-AE 載入 obj, mtl, texture</h2>



<p>建議可以先把 jPCT-AE 的 ImageTargetRenderer.java 的建構式注解起來，到時候如果改壞了，還可以還原回去，然後把以下建構式的程式碼貼上</p>



<pre class="wp-block-preformatted withcode">public ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {
     mActivity = activity;
     vuforiaAppSession = session;
     world = new World();
     // 如果亮度太暗或是亮度怪怪的，可以調整這裡
     world.setAmbientLight(150, 150, 150);
     world.setClippingPlanes(2.0f, 3000.0f);
     sun = new Light(world);
     // 如果亮度太暗或是亮度怪怪的，可以調整這裡
     sun.setIntensity(250, 250, 250);
     try{
         // 載入材質，第一個參數是 texture 名稱，這邊使用原始檔名
         // 因為當載入 mtl 時，mtl 的檔名會自動對應到該 texture
         TextureManager.getInstance().addTexture(
                 "Bedside_Table_D_default_1_1.png",
                 new Texture(mActivity.getAssets().open("texture/Bedside_Table_D_default_1_1.png"))
         );
         // loadOBJ 參數分別是：.obj, .mtl, 縮放大小
         Object3D[] tmp = Loader.loadOBJ(
                 mActivity.getAssets().open("obj/Bedside Table D.obj"),
                 mActivity.getAssets().open("mtl/Bedside_Table_D.mtl"),
                 5
         );
         if(tmp != null &amp;&amp; tmp.length >= 1){
             cylinder = tmp[0];
         }
         cylinder.strip();
         cylinder.build();
         // 位移
         cylinder.translate(-110, -160, 0);
         // x 軸旋轉，不然載入的櫃子可能是趴著或是躺著的
         cylinder.rotateX(-1.5f);
         // 如果有 mtl 就可以不用 setTexture，mtl 內有 texture 名稱會自動載入
         //cylinder.setTexture("Bedside_Table_D_default_1_1.png");
         world.addObject(cylinder);
         cam = world.getCamera();
         SimpleVector sv = new SimpleVector();
         sv.set(cylinder.getTransformedCenter());
         sv.y -= 100;
         sv.z -= 100;
         sun.setPosition(sv);
     }catch(Exception e){
         e.printStackTrace();
     }
     MemoryHelper.compact();
 }</pre>



<p></p>



<p>執行看看是不是可以正常載入一個櫃子了呢？</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/obj.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/obj-500x599.png" alt="載入 .obj 測試" class="wp-image-3760" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>載入 .obj 測試</figcaption></figure></div>



<h2 class="wp-block-heading">遭遇問題</h2>



<p>小蛙之前弄了半天，遇到一拖拉庫的錯誤，有些事情後來才釐清到底為什麼會發生錯誤，在 texture 的部份，<strong>圖片大小必須要是 2 的次方</strong>，像是：128, 256, 512, 1024, 2048 &#8230; 等，只要邊長不是 2 的次方，就會得到圖片大小錯誤的訊息，外加因為載不到圖片隨之而來的 javaNullPointer Exception。</p>



<p>render 出來沒有東西，這個要仔細看，有時候是<strong>模型太小</strong>，小蛙有一次 render 出來的東西，必須要放大 30000 倍，才符合使用大小 &#8230; 有時候是座標軸不對導致 redner 在 image target 下面 (被紙張遮住了)，有時候是沒有 mtl 也沒有材質，就會 render 出空的東西 (沒有東西) &#8230; 等，有時候是 mtl 裡面的 texture 有問題，像是根本沒有 texture 資訊，或是 texture 資訊還是錯誤的檔案路徑(如：C:\xxx\rrr\ccc\xx.png 但是實際上根本沒有這種路徑，此時就要手動修正他)，有時候其實根本也不知道為什麼就是沒有東西。</p>



<p>到 TD3M 多下載幾個範例檔試試看，再慢慢釐清為什麼不能載入的原因，這個範例應該是不需要做什麼調整就可以直接載入，因此使用這個當作範例。</p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="Bedside Table (4 skins) @ TF3DM (在新分頁中開啟)" href="http://tf3dm.com/3d-model/bedside-table-4-skins-96709.html" target="_blank" data-wpel-link="external" class="wpel-icon-right">Bedside Table (4 skins) @ TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (1) &#8211; 基本範例</title>
		<link>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/</link>
					<comments>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 05 Jul 2016 23:57:58 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[armeabi-v7a]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[3d Model]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3639</guid>

					<description><![CDATA[<p>說來慚愧，從 Google Adsense 被 ban 之後，就好久沒有發文了，站上 Vuforia 的文章也已經是好久以前的事情了 (遠目)，最近有專案要用到 Vuforia，爬以前的文回來看，蛙哩&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) &#8211; 基本範例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>說來慚愧，從 Google Adsense 被 ban 之後，就好久沒有發文了，站上 Vuforia 的文章也已經是好久以前的事情了 (遠目)，最近有專案要用到 Vuforia，爬以前的文回來看，蛙哩咧 &#8230; 現在已經更新到 Vuforia 5 了 &#8230; 真的是好遙遠啊！這篇記錄怎麼讓 Vuforia 可以透過 jPCT-AE 這套工具把 3D 模型 render 出來，而不是透過之前&nbsp;<a rel="noreferrer noopener" aria-label=" (在新分頁中開啟)" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" target="_blank" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a> 這種轉換方式，系列文內會大概講解遭遇到的問題。 </p>



<span id="more-3639"></span>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/WM2Small.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/WM2Small.png" alt="圖片來源：https://developer.vuforia.com/library/articles/FAQ/Watermark" class="wp-image-3655" title="Android Vuforia with jPCT-AE (1) - 基本範例"></a><figcaption> 圖片來源：https://developer.vuforia.com/library/articles/FAQ/Watermark </figcaption></figure></div>


<h2 class="para wp-block-heading">囉哩巴唆</h2>



<p>在&nbsp;Zachary Marv 的<a rel="noreferrer noopener" aria-label=" (在新分頁中開啟)" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h//comment-page-1#comment-32543" target="_blank" data-wpel-link="internal">這篇留言</a>中提到用這種方式產生出來的模型雖然是正確的，但是貼圖會變的怪怪的，沒有辦法像 Vuforia 的茶壺那樣好看，小蛙對 3D model 不怎麼了解 &#8230; 無法解答發生的原因以及要怎麼改善，但這的確是一個非常 OX 的問題 &#8230;</p>



<p>這次專案又要用到 AR 相關的技術，想說之前使用過 Vuforia，那就繼續用用看吧！對 Vuforia 的記憶根本就消失殆盡，還好之前有留系列文章下來： </p>



<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>


<p>but &#8230; 人生最大條的就是這個 but &#8230; 版本也差太多了吧！連套件名稱都不一樣了 &#8230; 上述紀錄文只能當作找回記憶碎片的&#8221;參考文&#8221;了，不過這六篇還是有一點參考價值啦！進主題　～</p>
<h2 class="para">Vuforia Android Sample</h2>
<p>簡單敘述一下整個流程：</p>
<ol>
<li>必須要有一個 Vuforia 的帳號，註冊這檔事應該沒什麼難的地方，就填填資料就好了。</li>
<li>註冊完之後，建立一個 License Key (以前 3 版的時候沒有的)，官網教學。</li>
<li><span style="line-height: 1.5em;">複製下來自己的 License Key (就是那一長串看不懂的東西)。</span></li>
<li><span style="line-height: 1.5em;">到</span><a style="line-height: 1.5em;" href="https://developer.vuforia.com/downloads/sdk" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a><span style="line-height: 1.5em;">下載 Vuforia SDK，解壓縮好放在一個容易找到的地方，例如：c:\vuforia\。</span></li>
<li><span style="line-height: 1.5em;">到</span><a style="line-height: 1.5em;" href="https://developer.vuforia.com/downloads/samples" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a><span style="line-height: 1.5em;">下載 Vuforia Sample (Core Features 這一組)，隨便解壓縮到一個地方，然後用 Android Studio 匯入。</span></li>
<li><span style="line-height: 1.5em;">打開之後看看缺少那些 jar，然後去上面的 SDK 裡面找，把缺少的 jar include 進來。</span></li>
<li><span style="line-height: 1.5em;">打開 com.vuforia.samples.SampleApplication.SampleApplicationSession.java，搜尋「Vuforia.setInitParameters」，把剛剛建立的 License Key 貼在這邊。</span></li>
<li>檢查看看還有沒有紅字，沒有的話應該就可以正常執行了 (不行別罵小蛙，感覺應該是這樣)。</li>
</ol>
<h2 class="para">Vuforia Android JNI Sample</h2>
<p>到這裡應該是不會有什麼問題才對，因為比較麻煩的是 Vuforia Sample Advanced Topics 這組，如果要使用 obj 轉 .h 的方法可以下載 Vuforia Sample Advanced Topics 這組，經過小蛙測試以及上面 Zachary Marv 提到的，texture 透過 JNI 的方式 render 出來會怪怪的，剛接觸的網友可以試試看上面教學的 (4) (5) (6)，也可以順便熟悉一下 JNI 的運作 (如果是使用 JNI 的朋友會比較麻煩，簡單一點的方法是把 Vuforia SDK 中的 build 目錄複製下來，丟進 ImageTargetsNative-5-5-9\app\src\main\ 下，接著修改 app/build.gradle</p>
<div>
<div id="highlighter_635106" class="syntaxhighlighter  shell">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="shell plain">def VUFORIA_SDK_DIR = </code><code class="shell string">'C:\\vuforia'</code>   <code class="shell plain">//</code> <code class="shell plain">改成你的 Vuforia SDK 位置</code></div>
<div class="line number2 index1 alt1"><code class="shell plain">def JAR_DIR = </code><code class="shell string">'build/java/vuforia'</code>    <code class="shell plain">//</code> <code class="shell plain">如果照著上面做的話，直接寫這樣</code></div>
<div class="line number3 index2 alt2"><code class="shell plain">sourceSets.main {</code></div>
<div class="line number4 index3 alt1"><code class="shell spaces">    </code><code class="shell plain">jni.srcDirs = []</code></div>
<div class="line number5 index4 alt2"><code class="shell spaces">    </code><code class="shell plain">jniLibs.srcDir </code><code class="shell string">"src/main/libs/"</code></div>
<div class="line number6 index5 alt1"><code class="shell spaces">    </code><code class="shell plain">//</code> <code class="shell plain">檢查裡面要有 armeabi-v7a 資料夾，如果沒有就去 Vuforia SDK 下複製</code></div>
<div class="line number7 index6 alt2"><code class="shell plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><span style="line-height: 1.5em;">第二個要修改的部份是 ImageTargetsNative-5-5-9\app\src\main\jni\Android.mk</span></p>
<div>
<div id="highlighter_330442" class="syntaxhighlighter  shell">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="shell plain">//</code> <code class="shell plain">如果是照著上面步驟的話，改成這樣，不然就自己 trace 路徑看看</code></div>
<div class="line number2 index1 alt1"><code class="shell plain">LOCAL_SRC_FILES = ..</code><code class="shell plain">/build/lib/</code><code class="shell plain">$(TARGET_ARCH_ABI)</code><code class="shell plain">/libVuforia</code><code class="shell plain">.so</code></div>
<div class="line number3 index2 alt2"><code class="shell plain">//</code> <code class="shell plain">如果是照著上面步驟的話，改成這樣，不然就自己 trace 路徑看看</code></div>
<div class="line number4 index3 alt1"><code class="shell plain">LOCAL_EXPORT_C_INCLUDES := ..</code><code class="shell plain">/build/include</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>完成之後點擊選單列 Build -&gt; Make Project，如果沒有錯誤，直接執行就可以了！</p>
<h2 class="para">Vuforia Android Sample With jPCT-AE</h2>
<p>要使用 jPCT-AE 把 3D 模型呈現出來很簡單，只要幾個步驟就可以了：</p>
<ol>
<li>到 <a href="https://github.com/TheMaggieSimpson/Vuforia559_jPCT-AE" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載整個 project。</li>
<li>直接匯入 Android Studio，跟上面一樣搜尋「Vuforia.setInitParameters」，把 Vuforia License Key 貼進去。</li>
<li>這時候應該很多紅字，到 Vuforia SDK 中 (如小蛙的位置在 C:\vuforia\build\java\vuforia) 把 Vuforia.jar 複製到 Vuforia559_jPCT-AE-master\app\libs 中。</li>
<li>找到 build.gradle 新增 Vuforia.jar
<div>
<div id="highlighter_693566" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">dependencies {</code></div>
<div class="line number2 index1 alt1"><code class="text spaces">    </code><code class="text plain">compile files('libs/jpct_ae.jar')</code></div>
<div class="line number3 index2 alt2"><code class="text spaces">    </code><code class="text plain">compile files('libs/Vuforia.jar')  // 新增這行</code></div>
<div class="line number4 index3 alt1"><code class="text plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</li>
<li>直接 run 專案，就可以看到結果了！</li>
</ol>
<p>啥？那麼簡單？沒錯，就是這麼簡單 &#8230; 如果直接運行這個範例的話，會看到一個桶子，然後桶子看起來還有點昏暗，不過可以看到桶子表示已經成功了，下一篇將介紹怎麼載入其他 jPCT-AE 支援的 3D 模型。</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://developer.vuforia.com/" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Vuforia<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a href="https://github.com/TheMaggieSimpson/Vuforia559_jPCT-AE" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Vuforia559_jPCT-AE<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) &#8211; 基本範例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ClickForce (MobiForce) 當機問題</title>
		<link>https://noter.tw/3588/clickforce-mobiforce-%e7%95%b6%e6%a9%9f%e5%95%8f%e9%a1%8c/</link>
					<comments>https://noter.tw/3588/clickforce-mobiforce-%e7%95%b6%e6%a9%9f%e5%95%8f%e9%a1%8c/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 02 Sep 2015 02:32:51 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[ads]]></category>
		<category><![CDATA[clickforce]]></category>
		<category><![CDATA[mobiforce]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3588</guid>

					<description><![CDATA[<p>這真是個浪費時間又漫長的過程，CF 推出新版後台以及新版 SDK 的時候，小蛙就下載來測試，一開始小蛙直接套在「我的股票精算師」上，但只要一套上去就當機 &#8230; 我的股票精算師的架構比較舊，想&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3588/clickforce-mobiforce-%e7%95%b6%e6%a9%9f%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">ClickForce (MobiForce) 當機問題</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>這真是個浪費時間又漫長的過程，CF 推出新版後台以及新版 SDK 的時候，小蛙就下載來測試，一開始小蛙直接套在「我的股票精算師」上，但只要一套上去就當機 &#8230;<br />
<span id="more-3588"></span><br />
我的股票精算師的架構比較舊，想說可能是因為這樣才當機，試了好多方法，SDK 說明文件看了又看，還是一樣的狀況 &#8230;<br />
不要太固執，先跑跑看 CF 自己的 Sample Code 吧！一跑，喵的咧！一樣只要點選「展示」，立馬當機！怎麼可能有公司直接釋出有問題的 SDK 呢？把原本用來測試的 Nexus 7 二代換成自己的手機 HTC M7 來做測試，登愣 ~ 手機可以，至於 Nexus 7 二代為什麼不行呢？看了一下 logcat 的 error</p>
<pre>09-02 10:03:23.655    3775-3954/com.clickforce.MFAD E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-7730
    Process: com.clickforce.MFAD, PID: 3775
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.android.internal.telephony.Phone.updateServiceLocation()' on a null object reference
            at android.os.Parcel.readException(Parcel.java:1552)
            at android.os.Parcel.readException(Parcel.java:1499)
            at com.android.internal.telephony.ITelephony$Stub$Proxy.updateServiceLocation(ITelephony.java:1900)
            at android.telephony.CellLocation.requestLocationUpdate(CellLocation.java:42)
            at com.adcustom.sdk.utils.lbs.a.a(Unknown Source)
            at com.adcustom.sdk.utils.lbs.a.&lt;init&gt;(Unknown Source)
            at com.adcustom.sdk.utils.lbs.b.run(Unknown Source)</pre>
<p>錯誤在 com.clickforce.MFAD 裡面呼叫到 null 物件造成 java.lang.NullPointerException 例外 &#8230;  好吧！看來是 ClickForce SDK 呼叫造成，小蛙想改也沒辦法，不過為什麼手機可以，Nexus 7 二代卻不行呢？看了上面的訊息跟 internal.telephony.Phone.updateServiceLocation()，剛好 Nexus 7 二代沒有通話模組，就往這個方面去猜了！<br />
<span style="line-height: 1.5em;">也許他們的 SDK 只是 beta 版，寫信去跟 CF 反應好了，並且把小蛙的猜測告訴對方，</span>得到的結果是，我們的 SDK 應該沒有問題喔，工程師使用另一台沒有通話模組的平版測試也是沒有問題的，請小蛙再看看哪裡有問題，球又丟回來了 &#8230; SDK 是 CF 的，Sample Code 是 CF 的，小蛙只是直接執行 &#8230; 會是哪裡有問題呢？<br />
上網查了一下，似乎 Lollipop (5.x) 以上有不少人回報這個問題 &#8230; 但 &#8230; 這應該也不是小蛙要去解決的吧！大膽假設棒棒糖(Lollipop)版本對於沒有通話模組的平板可能會造成的問題 &#8230; maybe &#8230; 小蛙手邊沒有其他可以升上 5.x 且沒有通話模組的平板可以測試了，不過至少測試過 3 台 Nexus 7 二代確定是不行。<br />
看著 CF 後台流量跟點擊數越來越少，新版的 SDK 又面臨當機的問題 &#8230; 難不成要先過濾如果使用者是 Nexus 7 二代就不顯示廣告 &#8230; 哀 ~ 有空再來弄了！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3588/clickforce-mobiforce-%e7%95%b6%e6%a9%9f%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">ClickForce (MobiForce) 當機問題</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3588/clickforce-mobiforce-%e7%95%b6%e6%a9%9f%e5%95%8f%e9%a1%8c/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>我的股票精算師備份功能</title>
		<link>https://noter.tw/3552/%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab%e5%82%99%e4%bb%bd%e5%8a%9f%e8%83%bd/</link>
					<comments>https://noter.tw/3552/%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab%e5%82%99%e4%bb%bd%e5%8a%9f%e8%83%bd/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 06 Feb 2015 10:32:07 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[還原]]></category>
		<category><![CDATA[備份]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[我的股票精算師]]></category>
		<category><![CDATA[教學]]></category>
		<category><![CDATA[換手機]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3552</guid>

					<description><![CDATA[<p>常遇到使用者詢問「我的股票精算師」要怎麼備份，這篇記錄一下，需要寫怎麼備份表示軟體設計上有很大的問題，造成使用者使用上的困難，但小蛙最近沒有時間去做修改 &#8230; 只好委屈精算師的使用者了 &#038;g&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3552/%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab%e5%82%99%e4%bb%bd%e5%8a%9f%e8%83%bd/" data-wpel-link="internal">我的股票精算師備份功能</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>常遇到使用者詢問「我的股票精算師」要怎麼備份，這篇記錄一下，需要寫怎麼備份表示軟體設計上有很大的問題，造成使用者使用上的困難，但小蛙最近沒有時間去做修改 &#8230; 只好委屈精算師的使用者了 &gt;&lt;<br /><span id="more-3552"></span><br />我的股票精算師這 app 屬於比較早期製作，當 Android 版本持續更新，有新的元件出現之後，小蛙一直沒有時間去做更新 (除權息功能也根本沒有實作上去)，操作上可能對於沒有使用過舊版本的 Android 使用者來說會覺得很不人性化 (I&#8217;m sorry &#8230;)<br />選單的部分由於上述原因，使得這功能不容易被發現，在庫存頁面點選「選單」按鈕 (手機上的)，會出現「備份」、「還原」、「版本」這些選項，在歷史頁面中則會出現「匯出」的功能。以小蛙的 HTC New One (M7) 為例，手機上沒有選單按鍵，小蛙把他設定成長按 Home 鍵當作選單按鈕，以此方法呼叫出選單。<br />另一個 bug 尚未修正的是，有時候即使按了選單鈕，卻還是無法出現選單，這時候需要先切換到別的頁籤再切回來就可以看到選單 (I&#8217;m sorry &gt;&lt;) 以下圖解。</p>
<h2 class="para">備份</h2>
<p>真的有備份的選項！<br /><a title="Screenshot_2015-02-06-18-09-06.png" href="http://lh6.ggpht.com/-jGj5IF5KTYs/VNSTQcGcNaI/AAAAAAAAKso/muc3rgK-asM/s0/Screenshot_2015-02-06-18-09-06.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="Screenshot_2015-02-06-18-09-06.png" src="//lh6.ggpht.com/-jGj5IF5KTYs/VNSTQcGcNaI/AAAAAAAAKso/muc3rgK-asM/w500-o/Screenshot_2015-02-06-18-09-06.png" alt="Screenshot_2015-02-06-18-09-06.png" width="300" height="533" /></a><br />點選備份之後會把檔案儲存在 /sdcard/StockCal/ 資料夾中。</p>
<p style="text-align: center;"><a title="Screenshot_2015-02-06-18-09-16.png" href="http://lh4.ggpht.com/-eKu5MLSSb14/VNSTQBVL2xI/AAAAAAAAKsk/J7JqepeonCw/s0/Screenshot_2015-02-06-18-09-16.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo alignnone" title="Screenshot_2015-02-06-18-09-16.png" src="//lh4.ggpht.com/-eKu5MLSSb14/VNSTQBVL2xI/AAAAAAAAKsk/J7JqepeonCw/w500-o/Screenshot_2015-02-06-18-09-16.png" alt="Screenshot_2015-02-06-18-09-16.png" width="300" height="533" /></a>      <a title="Screenshot_2015-02-06-18-09-27.png" href="http://lh6.ggpht.com/-pI2EC3n7VHw/VNSTQ4vCbrI/AAAAAAAAKsw/UKyJrcJOlVw/s0/Screenshot_2015-02-06-18-09-27.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo alignnone" title="Screenshot_2015-02-06-18-09-27.png" src="//lh6.ggpht.com/-pI2EC3n7VHw/VNSTQ4vCbrI/AAAAAAAAKsw/UKyJrcJOlVw/w500-o/Screenshot_2015-02-06-18-09-27.png" alt="Screenshot_2015-02-06-18-09-27.png" width="300" height="533" /></a></p>
<h2 class="para">還原</h2>
<p>還原也是一樣，點了之後提示說要把備份的兩個檔案放在 /sdcard/StockCal/ 路徑下。<br /><a title="Screenshot_2015-02-06-18-09-43.png" href="http://lh5.ggpht.com/-qrjvDzZoE8I/VNSTR2wtIKI/AAAAAAAAKs0/j7TgOIc-EaQ/s0/Screenshot_2015-02-06-18-09-43.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="Screenshot_2015-02-06-18-09-43.png" src="//lh5.ggpht.com/-qrjvDzZoE8I/VNSTR2wtIKI/AAAAAAAAKs0/j7TgOIc-EaQ/w500-o/Screenshot_2015-02-06-18-09-43.png" alt="Screenshot_2015-02-06-18-09-43.png" width="300" height="533" /></a></p>
<h2 class="para">更換手機 (還原)</h2>
<p>如果是更換手機的話，先在原先手機上面執行備份的功能，接著把 /sdcard/StockCal/ 資料夾下的所有東西，複製到新手機的 /sdcard/StockCal/ (這邊可能要在新手機建立該資料夾)，放好之後點選還原選單即可！</p>
<p style="text-align: center;"><a title="Screenshot_2015-02-06-18-13-27.png" href="http://lh6.ggpht.com/-LZ3ZrMF93OM/VNST63HqL-I/AAAAAAAAKtA/o7OlxNwhhi4/s0/Screenshot_2015-02-06-18-13-27.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="Screenshot_2015-02-06-18-13-27.png" src="//lh6.ggpht.com/-LZ3ZrMF93OM/VNST63HqL-I/AAAAAAAAKtA/o7OlxNwhhi4/w500-o/Screenshot_2015-02-06-18-13-27.png" alt="Screenshot_2015-02-06-18-13-27.png" width="300" height="533" /></a>      <a style="line-height: 1.5em;" title="Screenshot_2015-02-06-18-13-35.png" href="http://lh3.ggpht.com/-kRFjIXhECac/VNST663DJ8I/AAAAAAAAKtE/Sw1HDhSgAck/s0/Screenshot_2015-02-06-18-13-35.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="Screenshot_2015-02-06-18-13-35.png" src="//lh3.ggpht.com/-kRFjIXhECac/VNST663DJ8I/AAAAAAAAKtE/Sw1HDhSgAck/w500-o/Screenshot_2015-02-06-18-13-35.png" alt="Screenshot_2015-02-06-18-13-35.png" width="300" height="533" /></a></p>
<p>那麼多 bug 沒有修正還敢上架給人用 &#8230; 快逃 &gt;..&lt;</p>


<script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"VideoObject","name":"我的股票精算師備份方式 | 計算及記錄股票投資損益的 app | 我的股票精算師 Ep1 | 記下來","description":"#我的股票精算師 有三種備份方式：\n1. 備份到手機 \n2. 備份到雲端硬碟\n3. 備份到 Gmail\n\n音樂資訊：\nTrack: ROY KNOX x WTCHOUT - Shadows (Feat. Sviivan) [NCS Release]\nMusic provided by NoCopyrightSounds.\nWatch: https:\/\/youtu.be\/o8Y_uR6ZDxo\nFree Download \/ Stream: http:\/\/ncs.io\/Shadows","thumbnailUrl":"https:\/\/i.ytimg.com\/vi\/f8srXALLC58\/maxresdefault.jpg","uploadDate":"2020-02-23T05:56:18Z","duration":"PT2M29S","embedUrl":"https:\/\/www.youtube.com\/watch?v=f8srXALLC58"}</script>



<p>影片操作</p>



<figure class="wp-block-embed-youtube aligncenter wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="video-container"><iframe title="我的股票精算師備份方式 | 計算及記錄股票投資損益的 app | 我的股票精算師 Ep1 | 記下來" width="500" height="281" src="https://www.youtube.com/embed/f8srXALLC58?feature=oembed&#038;wmode=opaque" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
</div></figure>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3552/%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab%e5%82%99%e4%bb%bd%e5%8a%9f%e8%83%bd/" data-wpel-link="internal">我的股票精算師備份功能</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3552/%e6%88%91%e7%9a%84%e8%82%a1%e7%a5%a8%e7%b2%be%e7%ae%97%e5%b8%ab%e5%82%99%e4%bb%bd%e5%8a%9f%e8%83%bd/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Java was started but returned exit code = 13</title>
		<link>https://noter.tw/3437/java-was-started-but-returned-exit-code-13/</link>
					<comments>https://noter.tw/3437/java-was-started-but-returned-exit-code-13/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Thu, 18 Dec 2014 03:43:20 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[code 13]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3437</guid>

					<description><![CDATA[<p>前陣子不知道做了什麼更新，今天要開 Eclipse 突然遇到這個錯誤 &#8230; 記錄一下，留給有需要的人，以 Java 更新的速度，應該很常遇到這個問題。 「Java was started b&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3437/java-was-started-but-returned-exit-code-13/" data-wpel-link="internal">Java was started but returned exit code = 13</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>前陣子不知道做了什麼更新，今天要開 Eclipse 突然遇到這個錯誤 &#8230; 記錄一下，留給有需要的人，以 Java 更新的速度，應該很常遇到這個問題。<br />
<span id="more-3437"></span><br />
「<span style="color: #ff0000;"><strong>Java was started but returned exit code = 13</strong></span>」要解決這個錯誤很簡單，Google 了一下就有很多類似的文章，這邊小蛙遇到這個問題自己記錄一下，大致上問題是出在某一次的 Java 更新後，用來啟動 Eclipse 的跟目前 JVM 的版本不符合，例如：一邊是 32 bit，一邊卻是 64 bit 造成的。<br />
小蛙這邊選了最簡單的一種，小蛙用的是 windows 8.1 到 「控制台」 -&gt; 「程式和功能」 -&gt;找到最近的一次 Java 更新，例如「Java 8 Update xx」，把他移除掉。再開啟 Eclipse 就可以了。<br />
參1、參2、參3 有其他更詳細介紹解決方法，不想把最新版更新移除掉的網友可以參考看看。<br />
<strong>參考資料：</strong></p>
<ol>
<li>MyEclipse 10 does not start “Java was started but returned exit code 13” @ stackoverflow<br />
<address><a href="http://stackoverflow.com/questions/11846758/myeclipse-10-does-not-start-java-was-started-but-returned-exit-code-13" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://stackoverflow.com/questions/11846758/myeclipse-10-does-not-start-java-was-started-but-returned-exit-code-13<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>eclipse启动不了，出现“Java was started but returned exit code=13&#8230;&#8230;”对话框 @ 百度知道<br />
<address><a href="http://zhidao.baidu.com/question/224582151.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://zhidao.baidu.com/question/224582151.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>20140827-幫曲仔寫APP-安裝環境篇 @ TK呱呱<br />
<address><a href="http://gienmin.blogspot.tw/2014/08/20140827-app.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://gienmin.blogspot.tw/2014/08/20140827-app.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3437/java-was-started-but-returned-exit-code-13/" data-wpel-link="internal">Java was started but returned exit code = 13</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3437/java-was-started-but-returned-exit-code-13/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
