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 2

LOG
PART 1 : แว๊น | PART 2 : สำรวจโลก | PART 3 : งานวันแรก

PART 4 | วันที่ 5 สิงหาคม 2555 : วันที่ 2 และเป็นวันสุดท้ายของงาน Web3D Conference 2012 และเป็นวันแรกของงาน SIGGRAPH 2012

หลังจากวันแรกของงานผ่านไปได้ด้วยดี วันนี้กิจกรรมก็เหมือนวันแรกครับ นำเสนอเปเปอร์และ Tutorial, Workshop ปกติ แต่ที่ต่างไปมากคือจำนวนคนครับ มีมากเยอะมากๆ ก็เนื่องจากงาน SIGGRAPH นี่แหละครับ

จากภาพนี่เป็นช่วงเช้าก่อนงานเริ่มครับ เห็นเขานั่งเรียงๆกันผมก็เลยไปสมทบกับเขาด้วย ฮ่ะ ๆ ๆ
สำหรับผู้ที่มางานนี้ ต้องไปลงทะเบียนก่อนครับ เพื่อรับป้ายชื่อและจะมี Code ที่บอกว่าเราเข้างานส่วนไหนได้บ้าง ที่เป็นป้ายมีสายห้อยสีเขียวๆนั่นอ่ะครับ ผมก็ไปฉกมามั่ง

เสร็จจากการลงทะเบียน SIGGRAPH แล้วผมก็ขึ้นไปที่ห้องของงาน Web3D ครับ แล้วทีนี้เขาเลื่อนเวลานิดหน่อย เลยมีเวลาไปช๊อปหนังสือครับ ซึ่งก็อยู่ห้องข้างๆกันนี่เอง

มีหนังสือที่น่าสนใจหลายเล่มมากครับ แต่ก็ไม่ได้สอยมาซักเล่มเลย แฮ่ๆ

หลังจากนั้นก็กลับมาที่ห้องครับ มาฟังเรื่อง WebGL โดย Neil Trevett จาก Khronos Group ครับ ถึงแนวทางของ OpenGL ES, WebGL, WebCL และอื่นๆ ที่น่าสนใจมากคือเขาบอกว่า WebCL จะ release ตัวเต็มปีหน้าครับ ซึ่งมันเป็นอะไรที่เป็นอนาคตของ Web3D เลย เพราะปัจจุบันยังมีปัญหาเรื่อง Performance อยู่ครับ ต้องการ Performance Boost ซึ่งหาก WebCL มาจะลบจุดนี้ไปได้เลย มุมมองผมในปัจจุบันผมว่า WebGL ก็มีพลังมากพอในการทำอะไรหลายๆอย่างที่เป็น Commercial แล้วนะครับ และสำหรับงานวิจัยหลายๆงาน ก็นำมาใช้แล้ว งาน Simulation และ Visualization ทางวิศวกรรมและทางการแพทย์ก็เห็นมีการนำมาใช้แล้วในยุโรป ซึ่งผมเห็นว่าอนาคตสดใสดีครับ

ถัดจากนั้นก็มีคนจาก Google มาคุยเรื่อง WebGL, เอา WebGL Experiments หลายๆตัวมาโชว์ ซึ่งผมเคยเห็นหมดแล้ว ไม่ได้รู้สึกตื่นเต้นอะไร แต่ก็มีหลายๆคนสนใจครับ เพราะคนที่เข้ามาฟังส่วนใหญ่ยังอยู่ใน Platform ที่ไม่ใช่แบบเปิด ยังใช้ VRML/X3D กันอยู่ ยังไม่ได้เข้าสู่โลก WebGL เต็มๆ เขาก็มาโชว์อนาคตที่น่าสนใจของเทคโนโลยีตัวนี้ครับ ก็ดีเหมือนกัน โดยรวมผมชอบเรื่องความฮาของพี่แก ฮ่ะ ๆ ๆ ;P

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

แล้วก็เริ่มกิจกรรมช่วงบ่ายกันเลย เริ่มด้วยเรื่อง Declarative 3D นำโดย Kristian Sons และ Johannes Behr ครับ ส่วนอีกห้องที่ผมไม่ได้อยู่คือเรื่อง Lightweight Visualization โดย Julien Jomier จาก Kitware ครับ
น่าสนใจดีครับ เขาเอา Binary Compression มาโชว์ แบบว่าเหมือนตัว Performance Boost ที่เคยกล่าวก่อนหน้าอ่ะครับ สามารถเรนเดอร์พ้อยได้เป็นล้านเลย จากปกติไม่กี่แสน เจ๋งดีครับ

หลังจากเสร็จทั้ง 2 กิจกรรมนั้นแล้ว ทุกคนก็มารวมกันที่ห้องเดียวครับ เป็น Session เรื่อง 3D and the Web รวมๆก็คล้ายๆเหมือนไปนั่งรวมกันปล่อยมุขสักพักนึงอ่ะครับ ถึงมาเข้าเรื่อง ฮ่ะ ๆๆ

หลังจาก Session จบลงก็เป็นช่วงของการประกาศผลรางวัลสำหรับ Best Paper Award และ Best Poster Award ครับ ซึ่งผลก็คือ

Best Poster Award, Web3D Conference 2012
Best Poster Award, Web3D Conference 2012

ก็ดีใจครับ ;P
หลายๆคนก็มาแสดงความยินดีครับ ได้นามบัตร ได้คนชวนไปเรียน ส่วนตัวคิดว่าคุ้มค่าครับ เดี๋ยวปีหน้าเอาอีก โดยปีหน้า Web3D Conference 2013 อาจไปจัดที่สเปน หรือไม่ก็ที่เยอรมนีครับ ยังไม่มีการยืนยัน จากที่ฟังตอนเขาปิดงาน
หลังจากจบงาน Web3D Conference 2012 แล้วก็ไปต่อที่งาน SIGGRAPH 2012 ครับ เป็นช่วง SIGGRAPH Paper Fast Forward ซึ่งเป็นอะไรที่ฮามากๆ หลายคนทำวิดีโอนำเสนอได้ฮาสุดๆเป็นอะไรที่ชอบมาก ผมยังไม่เคยเห็นแบบนี้ในไทยเลยครับ รักเลย ฮาๆๆ

SIGGRAPH 2012 Paper Fast Forward
SIGGRAPH 2012 Paper Fast Forward

อันที่จริงเขาไม่ให้ถ่ายรูปนะครับเนี่ย แต่ผมก็ถ่ายมา แถมยังเอามาลง Blog อีก เหอๆๆ
หลังจากยืนอยู่ท้ายๆห้องสักพัก (เพราะเข้าห้องไปช้า คุยกับคนในงาน Web3D นานพอสมควร) เขาก็เปิดห้องใหม่ให้ โดยเป็นห้องที่ดูภาพถ่ายทอดสดจากห้องใหญ่อีกทีครับ

SIGGRAPH 2012 Paper Fast Forward
SIGGRAPH 2012 Paper Fast Forward

หลายๆเปเปอร์ หลายๆโปรเจค น่าสนใจมากๆๆๆๆครับ หากใครมีโอกาสปีถัดๆไปอยากให้มาดูกันครับ หลายๆอย่างไม่น่าเชื่อจริงๆว่ามันเกิดขึ้นแล้ว ;P
หลังจากจบกิจกรรม Paper Fast Forward ก็ออกไปหาข้าวกินกลับที่พักครับ ซึ่งคนเยอะมากๆเลยครับ

SIGGRAPH 2012, LA Convention Center, LA, CA, USA
SIGGRAPH 2012, LA Convention Center, LA, CA, USA

โดยสรุปแล้ว งานสนุกมาก แล้วก็ฟินด้วยครับ เป็นปีแรกด้วย แล้วได้รางวัลอีก ฟินครับ ต้องพัฒนามากขึ้นๆๆๆไปอีกครับ หวังว่าปีหน้าคงได้เจอกันที่งาน Web3D Conference 2013 และสำหรับ SIGGRAPH 2013 ที่จะจัดที่ Anaheim, CA ครับ อยู่ใกล้ Irvine กว่า LA อีก น่าจะได้มีอะไรสนุกๆทำอีกหลายอย่างเลยครับ ;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

[X3DOM Demo] Create geometry by using JavaScript

1. Prepare your HTML file.
Don’t forget to link your HTML file with x3dom.js and spheretroupe.js or your JS file.

SphereTroupe: Link to JS files.

You also can link X3DOM JavaScript from this link: http://x3dom.org/x3dom/src/x3dom.js

Write your X3D Tag in body tag in your HTML file

SphereTroupe: X3D Tag in HTML file

2. Create your JavaScript file and write your function in this file.

SphereTroupe: spheretroupe.js

You can write X3D in document.write(“”); same as using createVrmlFromString in VRML if your ever seen it. But in X3DOM it’s easier, See SphereInit function.

Result of SphereTroupe Demo
– Default View

SphereTroupe: Default view

- Perspective View

SphereTroupe: Perspective view

- Point Mode in Perspective View (by type “m” on your keyboard)

SphereTroupe: Points Mode in Perspective View