X3DOM Configuration | ภาษาไทย

ใน X3D element นั้นมี tag ที่สามารถตั้งค่าสำหรับ runtime ได้คือ param โดยจะต้องประกาศใน X3D element

เช่นตัวอย่างโค้ดข้างล่างนี้

<x3d>
    <param name="showStat" value="true"></param>
    <param name="PrimitiveQuality" value="high"></param>
    <param name="disableDoubleClick" value="true"></param>
    <scene>
    ...
    </scene>
</x3d>

โดย options ที่สามารถตั้งค่าได้ตั้งแต่ X3DOM รุ่น 1.4 มามีดังนี้

Continue reading

Web3D & SIGGRAPH Conferences 2012, Los Angeles, CA, USA. Diary : Day 1

Part 3. วันที่ 4 สิงหาคม 2555 : วันแรกของงาน Web3D Conference 2012 เริ่มก่อนหน้า SIGGRAPH ไป 1 วัน
(Link สำหรับ Part 1 และ Part 2)

วันนี้ก็เดินออกมาจากโรงแรมตามแผนที่วางไว้เมื่อวันก่อนที่มาเดินสำรวจไว้แล้ว มาได้ตรงเวลาแบบเป๊ะๆเลยเพราะว่าตื่นสาย ใจจริงอยากจะเผื่อเวลาไว้แต่ว่าตื่นสายจริงๆ ฮ่ะๆๆ ๆ วันนี้คนยังไม่มากเท่าไหร่ เพราะมีงาน Web3D Conference งานเดียว แต่สำหรับคนที่ส่งโปสเตอร์สำหรับงาน SIGGRAPH 2012 เขาก็มาติดโปสเตอร์กันวันนี้แหละครับ บางคนติดก่อนหน้านั้นไปแล้วก็มี

LA Convention Center
LA Convention Center

หลังจากผมเดินหลงอยู่ใน LA Convention Center ได้สักพัก เห็นคนทำหน้าหลงๆเหมือนกันก็ถามๆกันจนมาเจอ Hall นี้ ถึงกับโล่งใจว่าเจอสักที แล้วก็ขึ้นบันไดเลื่อนมาที่ห้องสำหรับงานเปิด Web3D Conference 2012 ด้วยใจร้อนรนว่าเรามาถึงเลทไปห้านาทีแล้ว แฮ่ๆ

Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Web3D Conference 2012 at LA Convention Center, LA, CA, USA

หลังจากลงทะเบียนแล้ว ก็ได้ป้ายชื่อกับกระเป๋ามาครับ : )

Web3D Conference 2012
Web3D Conference 2012

หลังจากนั้นก็นั่งฟังป๋าๆเขาพูดเปิดงาน อธิบาย นู่น นี่ นั่น และกำหนดการของแต่ละวัน ทำอะไรบ้าง อะไรยังไง หลังจากทุกอย่างเรียบร้อยแล้วก็แยกห้องตามแต่ละเรื่องครับ จะแบ่งห้องนำเสนอเปเปอร์กับห้อง Tutorial, Workshop เป็นคนละห้องกัน ก็แล้วแต่คนชอบครับ ตามหัวข้อเรื่องสนใจอะไรก็ไปตามห้องนั้นครับ

ระหว่างนั้นก็มีคนซุบซิบตามหาชื่อแต่ละคนว่ามาไหม มีโปสเตอร์มาไหม จนได้ยินชื่อคุ้นๆ เลยเข้าไปถามว่า เมื่อกี้เรียกอะไรหัสดีเหรอครับ พี่ staff เขาก็เลย อ้ออ นี่หัสดีเหรอ ได้เอาโปสเตอร์มาไหม ผมก็ตอบอย่างภาคภูมิว่า ไม่ได้เอามาครับ ฮ่ะๆๆ เขาก็เลยให้เราส่ง PDF ให้ แล้วเขาก็เอาไปปริ๊นให้ครับ ดีจริงๆ ;D

หลังจากกิจกรรมภาคเช้าเสร็จสิ้นลง ก็กินข้าวกันครับ กับเหล่า Web3D geek คนอื่นๆ

Web3D Conference 2012
Web3D Conference 2012

ผมไปคนเดียวไม่รู้จักใครเลยครับ ไปนั่งฟังเขาคุยกัน เขาถามมาเราก็ตอบไป ส่วนใหญ่นั่งฟังครับ มีปัญหานิดหน่อยคือผมฟังภาษาอังกฤษสำเนียงสเปน อิตาลี ไม่ค่อยคล่องนัก แต่ก็พอรู้เรื่องอยู่มั้ง แต่ฟังยากจริงๆ พอดีหลงมานั่งอยู่โต๊ะนี้ครับ จากการสำรวจดู งานนี้ผมเด็กสุดครับ รู้สึกดี ฮาๆๆ
อ๊ะ! มีอีกคนนึงชื่อ Sergiy Byelozyorov คนนี้พูดเก่งมากครับ พูดไม่หยุด พูดตลอด เหมือนว่าจะมาจากยูเครนหรือไงนี่แหละครับ จำไม่ค่อยได้ แต่ว่าเขาเรียนอยู่ที่เยอรมันครับ ที่ Universität des Saarlandes ที่ Saarbrücken ก็มีเรื่องคุยกันเยอะเลย แต่เอาเข้าจริงก็ไม่ได้จะมีเยอะขึ้นนักหรอกครับ เพราะผมเคยอยู่แต่ München แค่เขาหันมาคุยกับเราบ่อยขึ้นแค่นั้น ฮ่ะๆๆ เขามี Workshop ช่วงบ่ายของวันนี้ด้วยครับ หัวข้อ Virtual Worlds in the Web ถือว่าได้เพื่อนมาอีกคนเพราะอายุห่างกันไม่มากครับ เขาเป็นพี่ผม 3 ปีเอง ถือว่ารุ่นๆเดียวกัน หากจะเทียบกับคนอื่นในงานซึ่งเป็นระดับป๋ากันเกือบหมดแล้ว

หลังจากรับประทานอาหารเสร็จแล้ว ก็กลับเข้าสู่ห้องสัมมนาครับ โดยช่วงแรกของบ่ายนี้จะเป็น Keynote ของ Prof. Markus Gross จาก Disney Research – Zurich ครับ มาเล่าถึงประวัติการเกิด Animation เก่าก่อนเลย การเริ่มต้นของ Computer Graphics ไล่จาก 2D มาเป็น 3D โดยนำตัวอย่างงานวิจัยของ Disney มาตั้งแต่แรกๆเลยครับ ว่าเขาทำอะไรกันมา จุดกำเนิดของ Mickey Mouse แล้วก็มีอะไรหลายอย่างขำๆให้ดูเยอะเลยครับ น่าสนใจมากเลยทีเดียว : )

หลังจากเสร็จสิ้นกิจกรรมลงช่วงเย็นก็มานำเสนอโปสเตอร์ครับ เราก็มายืนประจำโปสเตอร์ แต่ผมไม่ค่อยยืนกับพี่หรอกครับ เดินว่อนมาว่อนมา ถามงานคนอื่นไปเร่ือย มีบางงานน่าสนใจมากครับ เกี่ยวกับ Geospatial Visualization ชื่อ “Pervasive Touristic Location Based Service Mobile App with a Social Perspective” แต่เขาใช้ Unity ไม่ใช่ WebGL เป็นบริษัทจากอิตาลีครับชื่อ Fondazione Graphitech ผมยืนคุยด้วยอยู่นานเลยแหละครับ เพราะผมสนใจเกี่ยวกับ Geospatial Visualization มากๆ จะไปแอบดูดข้อมูลว่าเขาเอาข้อมูลจากไหนมาทำ ก็สนุกดีครับ ส่วนที่น่าสนใจอีกงานแต่ผมก็ไม่เข้าใจคืองาน “MEDX3DOM: MEDX3D for X3DOM” จาก Vicomtech ครับ เป็นการนำ X3DOM มาใช้สำหรับงาน Visualization ทางการแพทย์ ส่วนงานอื่นๆ เข้าไปดูได้ที่นี่เลยครับ ผมก็อธิบายไม่หมด มันจะยาวเกินไปครับ ;P Web3D 2012 Program

Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA
Posters of Web3D Conference 2012 at LA Convention Center, LA, CA, USA

หลังจากนำเสนอโปสเตอร์ไปจนอิ่มแล้ว น่าจะสักประมาณ 6 โมงกว่าๆครับ ก็เสร็จงาน เดินทางกลับโรงแรม แล้ว LA Convention Center อยู่ติดๆกับบ้านของ LA Laker ครับ สงสัยมีแข่งบาสจบพอดี มีแต่เด็กฮิปเต็มไปหมดเลย ฝั่งตรงข้ามถนนของตึกก็มีลานกว้างๆคนก็เล่นบาสกันเยอะแยะมาก ก็เป็นสีสันดีครับ

วันนี้ก็ราบรื่นดีครับ กับการลุยงานคนเดียวที่นี่ ไว้มาต่อวันที่ 2 ครับ ;D

[How to] Level Of Detail (LOD) – X3D(OM) Language [Tutorial in Thai language]

Level Of Detail (LOD) นั้นเป็น Grouping node ตัวหนึ่งในภาษา X3D (หรือเอามาใช้กับ X3DOM ก็ได้ซึ่งใช้ภาษาในการเขียนเป็น X3D เหมือนกัน)
โดย node นี้จะถูกใช้เพื่อการเพิ่มประสิทธิภาพในการเรนเดอร์วัตถุใน Scene เนื่องจากใน Scene ของเรานั้นจะมี Viewpoint อยู่อย่างน้อย node ซึ่งจะเป็นจุดกล้องของเรานั่นเอง ซึ่งมีความห่างในแกน x, y, z กับวัตถุ ซึ่งระยะห่างนี้เราสามารถกำหนดความละเอียดให้กับวัตถุที่เรามองเห็นได้ ลองนึกภาพว่าคุณมองวัตถุที่เห็นไกลๆแล้วคุณเห็นมันไม่ชัด คุณเดินเข้าไปใกล้ขึ้นเรื่อยๆ วัตถุนั้นก็จะชัดขึ้นเรื่อยๆตามลำดับ หากใครที่เคยเล่นเกมแนว 3D มาคงจะพอนึกภาพออกว่าเป็นยังไง
และความละเอียดนั่นเองที่เราจะถูกถึงการเพิ่มประสิทธิภาพของการเรนเดอร์ทั้ง Scene นั้นโดยรวม โดยเฉพาะอย่างยิ่งกับ Scene ที่มีวัตถุหลายๆวัตถุ เราก็ควรจะให้ความสำคัญกับวัตถุที่เราอยู่ใกล้ที่สุด คือ ให้เรามองเห็นสิ่งนั้นชัดที่สุด ละเอียดที่สุด นั่นหมายความว่า ยิ่งความละเอียดเยอะ ยิ่งมี Polygon มาก มีจุดมากนั่นเอง ซึ่งจำนวนจุด (Point) จำนวนรูปสามเหลี่ยม (Triangle) นั่นส่งผลต่อประสิทธิภาพในการเรนเดอร์และค่า Frame rate (หากดู Monitor ของ X3DOM คุณจะเห็นค่านี้แสดงเป็น x FPS โดย x เป็นตัวเลข Floating Point) หรือจากระยะหนึ่ง เข้าไปแล้วให้วัตถุเปลี่ยนไป เข้าไปอีกก็เปลี่ยนไปอีก ก็ได้แล้วแต่เราจะทำครับ

หลังจากพอเข้าใจหลักการคร่าวๆว่าโหนดนี้มีประโยชน์อย่างไร เรามาถึงวิธีการเขียนโหนด LOD กันครับ

<LOD center="0 0 0" range="10 15 20">

	<Group>
		<Shape DEF="Box">
			<Appearance DEF="BlueColor">
				<Material diffuseColor="0.0 0.2 0.8" />
			</Appearance>
			<Box />
		</Shape>
	</Group>

	<Group>
		<Shape>
			<Appearance USE="BlueColor"></Appearance>
			<Cone />
		</Shape>
	</Group>

	<Group>
		<Shape>
			<Appearance USE="BlueColor"></Appearance>
			<Cylinder />
		</Shape>
	</Group>
						
	<WorldInfo info='"null node"' />

</LOD>

จาก Source code
1. เริ่มประกาศโหนด LOD โดยกำหนด Attribute ให้ center มีค่าเป็น 0 0 0 นั่นหมายถึงเริ่มนับตำแหน่งของ LOD ที่จุด 0 0 0 คือจุดกลางของโหนดครับ (ทั้งนี้ไม่นับรวมถึงโหนด Transform นี่ครอบโหนด LOD นี้อีกที) และ range คือระยะห่างจากโหนด LOD ครับ จากตัวอย่างผมให้ระยะห่างเป็น 3 ช่วงคือ 10 15 และ 20 ครับ
2. จากนั้นแบ่งกลุ่มของวัตถุครับ ดังจะเห็นในบรรทัดที่ 3, 12 และ 19 นั่นคือการแบ่งช่วงระยะห่าง โดยนับจาก range คือ ระยะห่างจาก LOD ช่วง 0-10 จะแสดงวัตถุในกลุ่มแรก และมากกว่า 10-15 ก็จะแสดงวัตถุในกลุ่มที่สอง ตามด้วยช่วงมากกว่า 15-20 คือแสดงวันถุในกลุ่มที่สาม และหากระยะห่างจากจุด LOD มากกว่า 20 ขึ้นไป จะแสดงค่าตามบรรทัดที่ 26 ครับ คือบรรทัดนั้นผมกำหนดให้เขาเป็น null node นั่นหมายความว่า จะไม่แสดงอะไรเลย LOD นั้นก็จะหลายเป็นค่าว่างเลยครับ จะไม่มีจุดหรือสามเหลี่ยมอะไรที่ถูกเรนเดอร์ใน LOD นั้นแล้วครับ

จากตัวอย่างผมใช้วิธีเขียนวัตถุโดยใช้ Shape ในการเริ่มสร้างวัตถุง่ายๆขึ้นมาเช่น Box หรือ กล่อง, Cone หรือ กรวย และ Cylinder หรือวัตถุทรงกระบอกโดยให้ค่าเริ่มต้นเป็นค่าพื้นฐาน (Default) ตัววัตถุนั้นๆไป หากต้องการลูกเล่นเพิ่มเริม เราสามารถใช้โหนด Inline ในการเรียกวัตถุจากภายนอกไฟล์มาแทนในกลุ่มนั้นก็ได้ครับ โดยแทนโหนด Shape ไปครับ : )

เริ่มต้นกับ X3DOM | Getting Started with X3DOM

“Post นี้เหมาะสำหรับผู้ที่ต้องการเริ่มศึกษา/เล่นกับ X3DOM แต่ไม่รู้จะเริ่มยังไงครับ และถ้ามีพื้นฐานภาษา X3D แล้วจะติดปีกบินได้เลย ;D”

พื้นฐานและสิ่งที่คุณควรจะมี
1. Web Browser ที่รองรับ WebGL, HTML5 (Canvas) เช่น Google Chrome, Mozilla Firefox (แนะนำให้อัพเดทเป็นเวอร์ชั่นล่าสุดครับ ใครไม่เคยอัพเลยก็อัพซะนะครับ) **ล่าสุด Opera Next Version 12 ก็รองรับ WebGL แล้วนะท่าน**
2. พื้นฐานด้าน 3D เล็กๆน้อยๆพอเขี่ยๆสะกิดได้
3. ความรู้ในภาษา JavaScript สำหรับพอเล่นกับ X3DOM Runtime API ได้ (สำหรับในเชิงลึกหลังจากนี้)
4. ความรู้ในภาษา XML เพื่อให้เข้าใจภาษา X3D ได้ง่ายยิ่งขึ้น

ปัญหา
1. สำหรับคนที่มีไฟล์ VRML (.wrl) หรือ X3D (.x3d) อยู่แล้ว อยากอัพเกรดคุณภาพชีวิต เบื่อกับการใช้ Plugin ในการเปิด Web3D แล้ว อยากมาโลดแล่นบน Web Browser แบบ Unplugin โดยใช้ WebGL แทน แต่ไม่รู้จะทำไง เขียน WebGL ตรงๆก็อาจจะยากลำบากจนท้อแท้หน่ายชีวิตกัน.. จะทำยังไง?
2. มีไฟล์จาก Maya อยู่แล้ว แนะนำให้ไปอ่านโพสเก่าผม อันนี้
3. สำหรับคนที่มีไฟล์จาก 3Ds Max (.3ds) สามารถทำได้โดยการ Import ไฟล์นั้นเข้าไปที่ Blender (ต้องมี Blender ใช้ก่อนนะครับ ดาวน์โหลดและใช้ฟรีครับ) และ Export จาก Blender มาเป็น .x3d อีกที หรือใช้ BS Contact Plugin ทำการ Export ออกมาก็ย่อมได้

หลังจากมีไฟล์ X3D แล้ว สิเฮ็ดหยังต่อ?
1. ไฟล์ที่เราต้องการคือ x3dom.js
คำถาม เอามาจากไหน?
คำตอบ ดาวน์โหลดได้จาก X3DOM
2. โหลดมาแล้ว ทำไงต่อ?
คำตอบ เรียกใช้สิคร๊าบบบ

<script type="text/javascript" src="x3dom.js"></script>

ต่อจากนั้น เราก็ประกาศ ในหน้า HTML/XHTML ของเราได้เลยครับ
เช่น (เริ่มจากใน body เลยนะครับ)

<X3D xmlns="http://www.web3d.org/specifications/x3d-namespace"  showStat="false" showLog="false" x="0px" y="0px" width="400px" height="400px">
    <Scene>
        <Viewpoint position='0 0 10' />
        <Shape>
            <Appearance>
                <Material diffuseColor='0.603 0.894 0.909' />	
            </Appearance>
            <Box DEF='box'/>
        </Shape>
    </Scene>
</X3D>

อย่างเช่นโค้ดข้างบนนั้นคือ จะได้กล่องมา 1 กล่องครับ

ทั้งหมดนี้ก็เป็นพิธีกรรมในการเริ่มต้นครับ ลองเปิด Web Browser ของคุณได้เลย จะปรากฏกล่องให้คุณหมุนเล่นแล้วแหละครับ
Welcome to Web3D World ครับ : )

สำหรับตัวอย่างอื่นๆสามารถดูได้จากทาง Website ของ X3DOM ได้โดยตรงหรือดูจากหน้า X3DOM ของผมได้เหมือนกันครับ ไม่ต่างกันครับ : )

Get navigation type and set point rendering by using X3DOM Runtime API

First you have to call this method: ready() It is therefore possible to execute custom action by overriding this method in your code:

x3dom.runtime.ready = function()
{
	var id = "x3dom-scene";
	var configure = document.getElementById(id);
	
	/* Default view */
	configure.runtime.showAll();
	getNavigationType(id);
	
	/* =============================================================
	 Arguments:	show (boolean) – true/false to show or hide the debug window
	 Returns: The current visibility status of the debug window (true/false)
	 Displays or hides the debug window. If the parameter is omitted, the current visibility status is returned.
	 ============================================================= */
	configure.runtime.debug(false);
	
	/* =============================================================
	 Arguments:	mode (boolean) – true/false to enable or disable the stats info
	 Returns:The current visibility of the stats info (true/false)
	 Get or set the visibility of the statistics information.
	 If parameter is omitted, this method returns the visibility status as boolean.
	 ============================================================= */
	configure.runtime.statistics(false)
}

That’s your X3DOM scene ID is “x3dom-scene” and your default viewpoint is “showAll”

function getNavigationType(id)
{
	var configure = document.getElementById(id);
	
	var navigationTypeName = configure.runtime.navigationType();
	var currentViewpoint = configure.runtime.viewpoint();
	
	console.log(navigationTypeName);
	console.log(currentViewpoint);
	
	document.getElementById('showNavigationType').innerHTML = navigationTypeName;
	setSpeed(0, id);
}

This method is used to show your current navigation type and your current viewpoint in your X3DOM scene and appear the result to your browser console. and Now, I think you should know how to use X3DOM Runtime API method to your X3DOM scene.

So this is the method that doesn’t public on official page of X3DOM Runtime API, togglePoints method. This method is used to change render type from other to point rendering.

function togglePoint()
{
	var configure = document.getElementById("x3dom-scene");
	configure.runtime.togglePoints();
}

The result example:

When this method was called, your geometry will appear like this.

togglePoints Demo

Set Navigations and Viewpoints by using X3DOM Runtime API

This is the simple example code of setting navigations and viewpoints by using X3DOM Runtime API.

function setRuntime(typename, id)
{
	/* ====================================================
	 Arguments:	typename (string) -
	 To change mode or viewpoint.
	 walk() : Switches to walk mode.
	 examine() : Switches to examine mode.
	 lookAround() : Switches to lookAround mode.
	 lookAt() : Switches to lookAt mode.
	 resetView() : Navigates to the initial viewpoint.
	 uprightView() : Navigates to upright view.
	 showAll() : Zooms so that all objects are visible.
	 nextView() : Navigates to the next viewpoint.
	 prevView() : Navigates to the previous viewpoint.
	 Returns: The current mode or viewpoint.
	 Set mode or viewpoint of X3DOM element.
	 ==================================================== */
	
	var configure = document.getElementById(id);
	
	switch (typename)
	{
		case "walk": configure.runtime.walk(); break;
		case "fly": configure.runtime.fly(); break;
		case "examine": configure.runtime.examine(); break;
		case "lookAround": configure.runtime.lookAround(); break;
		case "lookAt": configure.runtime.lookAt(); break;
		case "game": configure.runtime.game(); break;
		case "resetView": configure.runtime.resetView(); break;
		case "uprightView": configure.runtime.uprightView(); break;
		case "showAll": configure.runtime.showAll(); break;
		case "nextView": configure.runtime.nextView(); break;
		case "prevView": configure.runtime.prevView(); break;
		case "upSpeed": setSpeed("up", id); break;
		case "downSpeed": setSpeed("down", id); break
		default: configure.runtime.examine();
	}
	getNavigationType(id);
}

And the experiment.

For more information about X3DOM Runtime API see: http://x3dom.org/docs/dev/api.html