Trang

Hiển thị các bài đăng có nhãn Thủ tuật. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Thủ tuật. Hiển thị tất cả bài đăng

14/5/20

3DPathFinding : tìm đường 3D đơn giản trong game !

Chuẩn bị cho game mới,mình làm lại hệ thống trợ giúp tìm đường trong máy tính.
Hệ thống này được lập trình không yêu cầu độ chính xác cao mà chỉ cần gần đúng và nhất là phải có tốc độ xử lý nhanh để có thể chạy realtime trong game !
Mới làm được thế này thôi :
Ảnh minh họa :



Mình sẽ cập nhật thêm các nâng cáp tiếp theo !
Nâng cấp nhân vật khác !


Clip mới ! 

Mới làm xong phần nhân vật đi theo nhân vật chính !

Nhân vật bơi được ! (tạm đủ dùng thôi vì đây không phải nhân vật chủ lực),mình cũng đã làm nhân vật bay được xong rồi ! tương tự nhau thôi !

Còn tiếp !
Hoàn thiện tìm đường cho các loại nhân vật => làm xong phần Debug datda tìm đường !
Screenshot !


Clip mô tả hoạt động hệ thống tìm đường :


Phần giới thiệu này tạm xong ! => chuyển qua thực hiện phần khác : nhân vật đu dây, leo tường....tư thế chết Ragdoll  => lập trình cho nhân vật hành động !




2/11/16

HƯỚNG DẪN DÙNG IRRLICHT
TRONG ANDOIRD
I. Bài dịch từ ví dụ về Android của Irrlicht (VD 27) :
Để dùng Android bạn cần cài đặt các phần sau :
- Android SDK (from http://developer.android.com)
- Android NDK (from http://developer.android.com)
- ant (a build tool commonly used for Java)
- A Java jdk (for example openjdk-6-jdk)
- GNU Make 3.81 hay mới hơn
- Nếu bạn dùng Window thì phải cài thêm Cygwin (version tối thiểu là 1.7)
Biên dịch Irrlicht và ứng dụng của bạn :
1. Gán đường dẫn của Android SDK vào biến môi trường ANDROID_HOME
2. Thêm đường dẫn : $ANDROID_HOME/tools, $ANDROID_HOME/platform-tools và đường dẫn chính Android NDKvào biến môi trường PATH
3. Vào thư mục bằng cmd : source->Irrlicht->Android và gõ : “ndk-build” hay “ndk-build NDEBUG=1" để biên dịch Irrlicht.
4. vào thư mục examples->27.HelloWorld_Mobile và gõ "ndk-build" hay "ndk-build NDEBUG=1"
5. Gõ "ant debug" để tạo file .APK
6. Chép file HelloWorldMobile-debug.apk vào điện thoại của bạn và cài đặt bình thường hay dùng cách sau :
- Kết nối điện thoại với PC (nhớ bật cho phép gở lỗi) hay chạy chương trình mô phỗng.
- Gõ "adb -d install bin/HelloWorldMobile-debug.apk" (nếu dùng chương trình mô phỗng hay thêm tham số "-e" thay vì "-d") để cài tập tin .APK vào chương trình mô phỗng.
Một số vấn đề :
Error: Unable to resolve project target 'android-10' (không tìm được ‘android-10’)
Cách giải quyết :
Chạy : "android sdk" trong thư mục sdk/tools và cài API 10.
Cách khác : đặt lại APP_PLATFORM trong file Application.mk cho project và cho Irrlicht. Trong trường hợp này bạn nên thay đổi luôn android:minSdkVersion trong file AndroidManifest.xml (đạ test chay Android-19 OK)

Mô tả các FILES :
AndroidManifest.xml:
            Mọi ứng dụng Android cần 1 file này để mô tả những cái cần thiết cho ứng dụng. Tên này phải chính xác là tên AndroidManifest.xml.
Xem http://developer.android.com/guide/topics/manifest/manifest-intro.html
                                                             
build.xml:
            Ant sẽ biên dịch file để tạo gói cuối cùng (.APK)
            Bạn có thể tạo một mô tả riêng như trong tài liệu của Android documentation:
            http://developer.android.com/tools/projects/projects-cmdline.html
            Điều này sau đó sẽ cập nhật file project.properties.
project.properties
            Bao gồm nhiều đích biên dịch (và có thể là thuộc tính của các project khác). Phải có file này.

jni:
            Một thư mục tên này phải là thư mục con của thư mục có chứa file build.xml.
            Thông thường nó chứa các file nguồn (c/c++), trong trong trường hợp của chúng ta dùng ở mức thư mục cao hơn (cùng mức với LOCAL_PATH chứa file Android.mk).
             
jni/Android.mk:
            Makefile cho project.
            Source-files trong project được thêm vào LOCAL_SRC_FILES
            Trong ví dụ Irrlicht example nó còn có thể sao chép vào thư mục assets, nhưng bạn còn có thể tạo assets đúng chổ.
                                               
jni/Application.mk:
            File tùy chọn ví dụ như bỏ bớt các module đã được cài và bạn có thể đặt kiến trúc đích xác định. Xem thêm thông tin trong thư mục docs của ndk.
                                                           
res:
            Thư mục có các tài nguyên được phân phối cho ứng dụng của bạn và có thể truy cập thông qua ID.
            Thật không may đến bây giờ NDK không thể truy cập  tài nguyên này. Vì thế bạn phải bằng cách nào đó truy cập chúng thông qua java-code và sao chép vào c++ hoặc bạn phải HACK để đọc định dạng trực tiếp(Một vài ứng dụng đã làm điều này, nhưng nó không an toàn trong tương lai và google không khuyến khích việc này).
            Hãy xem qua mục "App Resources" trong tài iệu android developer, vì nó khá phức tạp.
            Chúng ta chỉ dùng nó để lưu các icons cho ứng dụng trong ví dụ này.
             
assets:
            Các file ơ đây được phân phối trong ứng dụng của bạn. Nó hoạt động như hệ thống chỉ đọc.
           
assets/media/Shaders:
            Mã Shader cho driver OGLES2 điều khiển mô phổng một loạt hàm cố định.
            Trong ví dụ của chúng ta các lệnh này tự động thực thi việc sao chép trong file Android.mk.
            Đường dẫn mà chương trình shaders tìm kiếm đặt trong IRR_OGLES2_SHADER_PATH định nghĩa ở trong IrrCompileConfig.h
            Các tên là hardcoded  vì thế nó phải được xác định phải có trong thư mục media/Shaders.
            Bạn có thể viết lại shaders, nhưng chắc rằng thêm các file shaders hoạt động được bằng các tên này.
            OGLES1 driver không cần các file này.

obj:
            Tất cả các đối tượng và các thư viện được đặt tại đây trước khi chúng được liên kết với nhau.

libs:
            Chứa mã nhị phân của ứng dụng của bạn sau khi biên dịch. Ứng dụng bản thân nó là một lib(cơ bản vì mã giả “native code” không thể chạy trực tiếp chỉ gồm một lib).

src:
            Thư mục src chỉ cần thiết khi bạn có mã nguồn Javavà chỉ có các file .java và.aidl.

            Dù ví dụ này không dùng Java nhưng do makefile tạo thư mục này vì lệnh ant build.xml trong android sdk cần nó.
HƯỚNG DẪN DÙNG IRRLICHT
TRONG ANDOIRD
I. Bài dịch từ ví dụ về Android của Irrlicht (VD 27) :
Để dùng Android bạn cần cài đặt các phần sau :
- Android SDK (from http://developer.android.com)
- Android NDK (from http://developer.android.com)
- ant (a build tool commonly used for Java)
- A Java jdk (for example openjdk-6-jdk)
- GNU Make 3.81 hay mới hơn
- Nếu bạn dùng Window thì phải cài thêm Cygwin (version tối thiểu là 1.7)
Biên dịch Irrlicht và ứng dụng của bạn :
1. Gán đường dẫn của Android SDK vào biến môi trường ANDROID_HOME
2. Thêm đường dẫn : $ANDROID_HOME/tools, $ANDROID_HOME/platform-tools và đường dẫn chính Android NDKvào biến môi trường PATH
3. Vào thư mục bằng cmd : source->Irrlicht->Android và gõ : “ndk-build” hay “ndk-build NDEBUG=1" để biên dịch Irrlicht.
4. vào thư mục examples->27.HelloWorld_Mobile và gõ "ndk-build" hay "ndk-build NDEBUG=1"
5. Gõ "ant debug" để tạo file .APK
6. Chép file HelloWorldMobile-debug.apk vào điện thoại của bạn và cài đặt bình thường hay dùng cách sau :
- Kết nối điện thoại với PC (nhớ bật cho phép gở lỗi) hay chạy chương trình mô phỗng.
- Gõ "adb -d install bin/HelloWorldMobile-debug.apk" (nếu dùng chương trình mô phỗng hay thêm tham số "-e" thay vì "-d") để cài tập tin .APK vào chương trình mô phỗng.
Một số vấn đề :
Error: Unable to resolve project target 'android-10' (không tìm được ‘android-10’)
Cách giải quyết :
Chạy : "android sdk" trong thư mục sdk/tools và cài API 10.
Cách khác : đặt lại APP_PLATFORM trong file Application.mk cho project và cho Irrlicht. Trong trường hợp này bạn nên thay đổi luôn android:minSdkVersion trong file AndroidManifest.xml (đạ test chay Android-19 OK)

Mô tả các FILES :
AndroidManifest.xml:
            Mọi ứng dụng Android cần 1 file này để mô tả những cái cần thiết cho ứng dụng. Tên này phải chính xác là tên AndroidManifest.xml.
Xem http://developer.android.com/guide/topics/manifest/manifest-intro.html
                                                             
build.xml:
            Ant sẽ biên dịch file để tạo gói cuối cùng (.APK)
            Bạn có thể tạo một mô tả riêng như trong tài liệu của Android documentation:
            http://developer.android.com/tools/projects/projects-cmdline.html
            Điều này sau đó sẽ cập nhật file project.properties.
project.properties
            Bao gồm nhiều đích biên dịch (và có thể là thuộc tính của các project khác). Phải có file này.

jni:
            Một thư mục tên này phải là thư mục con của thư mục có chứa file build.xml.
            Thông thường nó chứa các file nguồn (c/c++), trong trong trường hợp của chúng ta dùng ở mức thư mục cao hơn (cùng mức với LOCAL_PATH chứa file Android.mk).
             
jni/Android.mk:
            Makefile cho project.
            Source-files trong project được thêm vào LOCAL_SRC_FILES
            Trong ví dụ Irrlicht example nó còn có thể sao chép vào thư mục assets, nhưng bạn còn có thể tạo assets đúng chổ.
                                               
jni/Application.mk:
            File tùy chọn ví dụ như bỏ bớt các module đã được cài và bạn có thể đặt kiến trúc đích xác định. Xem thêm thông tin trong thư mục docs của ndk.
                                                           
res:
            Thư mục có các tài nguyên được phân phối cho ứng dụng của bạn và có thể truy cập thông qua ID.
            Thật không may đến bây giờ NDK không thể truy cập  tài nguyên này. Vì thế bạn phải bằng cách nào đó truy cập chúng thông qua java-code và sao chép vào c++ hoặc bạn phải HACK để đọc định dạng trực tiếp(Một vài ứng dụng đã làm điều này, nhưng nó không an toàn trong tương lai và google không khuyến khích việc này).
            Hãy xem qua mục "App Resources" trong tài iệu android developer, vì nó khá phức tạp.
            Chúng ta chỉ dùng nó để lưu các icons cho ứng dụng trong ví dụ này.
             
assets:
            Các file ơ đây được phân phối trong ứng dụng của bạn. Nó hoạt động như hệ thống chỉ đọc.
           
assets/media/Shaders:
            Mã Shader cho driver OGLES2 điều khiển mô phổng một loạt hàm cố định.
            Trong ví dụ của chúng ta các lệnh này tự động thực thi việc sao chép trong file Android.mk.
            Đường dẫn mà chương trình shaders tìm kiếm đặt trong IRR_OGLES2_SHADER_PATH định nghĩa ở trong IrrCompileConfig.h
            Các tên là hardcoded  vì thế nó phải được xác định phải có trong thư mục media/Shaders.
            Bạn có thể viết lại shaders, nhưng chắc rằng thêm các file shaders hoạt động được bằng các tên này.
            OGLES1 driver không cần các file này.

obj:
            Tất cả các đối tượng và các thư viện được đặt tại đây trước khi chúng được liên kết với nhau.

libs:
            Chứa mã nhị phân của ứng dụng của bạn sau khi biên dịch. Ứng dụng bản thân nó là một lib(cơ bản vì mã giả “native code” không thể chạy trực tiếp chỉ gồm một lib).

src:
            Thư mục src chỉ cần thiết khi bạn có mã nguồn Javavà chỉ có các file .java và.aidl.

            Dù ví dụ này không dùng Java nhưng do makefile tạo thư mục này vì lệnh ant build.xml trong android sdk cần nó.

17/5/16

Auto Ragdoll using by Bullet in Irrlicht !

Tạo tư động tư thế chết cho mô hình 
- Trong lập trình game Ragdoll chính là tư thế chuyển tiếp lúc nhân vật đang hoạt động sang tư thế chết !
- Trước đây : người ta thường tạo hoạt cảnh tư thế chế cho nhân vật ,nhưng nó trông không thật và tốn rất nhiều tài nguyên làm hoạt cảnh
- Hiện nay , với sự trợ giúp của engine vật lý thì hoạt cảnh tư thế chết trông thật hơn nhưng mình thấy người ta tiếp cận theo kiểu là áp khung da vật lý cho mô hình trước và sau đó cho hoạt động trong game !  Với cách này thì tư thế Ragdoll sẽ rất thật và chính xác và tự nhiên ! Nhưng mình thấy có vấn đề như sau : nếu bạn có nhiều mô hình, với nhiều khung xương khác nhau thì bạn phải lần lượt áp vật lý cho từng nhân vật đó, công việc này thật mất rất nhiều thời gian ! Nhất là đối với Coder không rành về làm hoạt cảnh như mình !
Trích dẫn :
 - Cách tiếp cận của mình như sau : trong Irrlicht có hỗ trợ mô hình chuyển động bằng khung xương. Tại sao ta không tận dụng điều này một cách tự động. Ta cung cấp cho chương trình một Mesh có khung xương và áp vật lý cho nó ! Vậy là ta có chuyển động Ragdoll cho mô hình đó trong thời gian thực, nhược điểm của cách này là chuyển động của các khớp không thật cho lắp, nhưng nó lại có thể áp dụng cho bất cứ mô hình nào một cách tự động và thực hiện trong lúc chạy chương trình.
Mình đã mất rất nhiều thời gian mới hoàn thiện code này, nhưng như thế cũng đáng
Hình minh họa :



Kế hoạch kế tiếp :
Tạo hiệu ứng phá hủy mô hình một cách tự động (phá hủy không giới hạn) - như vậy thì game sẽ giống thật hơn. Để giữ tốc độ khung hình chấp nhận được, có thể mình làm hiệu ứng phá hủy nhưng không cần chính xác lắm nhằm đảm bảo tốc độ của chương trình



15/10/15

Chạy Irrlicht trên Android !
Lâu lắm rồi mới bắt tay làm lại
Hiện nay google đã ra bộ Android Studio và bỏ hỗ trợ Eclipse
Với Android Studio mình cũng mày mò được chút ít, nhưng cái đó là phần khác.
Còn bày này mình sẽ trình bày cách chạy Irrlicht trên Anroid dùng cách củ (đó là NDK, ANT và ABD...)
Để thực hiện bày này bạn cần cài đặt :
- Android SDK (from http://developer.android.com)
- Android NDK (from http://developer.android.com)
- ant (a build tool commonly used for Java)
- A Java jdk (for example openjdk-6-jdk)
- GNU Make 3.81 or later
- Trên Windows bạn cần có Cygwin (tối thiểu version 1.7)
Còn phien bản Irrlicht dùng Android bạn vào tải tại - nhấn nút download Snapshot:
http://sourceforge.net/p/irrlicht/code/HEAD/tree/branches/ogl-es/
Giải nén nó 
Mở ví dụ 27 thực hiện theo hướng dẫn.
Nhưng chắc chắc bạn sẽ gắp khó khăn này ???
- Khi biên dịch Irrlicht bằng NDK-Build thì OK
- Còn khi biên dịch ví dụ 27 bằng NDK-Build thì sẽ có lổi không biên dịch được, Do tệp tin Android.MK mà ra hết.
-Mình đã fixed lổi tệp tin này lại như sau :
(nội dung Android.MK)

LOCAL_PATH := $(call my-dir)\\..
IRRLICHT_PROJECT_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := Irrlicht
LOCAL_SRC_FILES := $(IRRLICHT_PROJECT_PATH)\\..\\..\\lib\\Android\\libIrrlicht.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := HelloWorldMobile

LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_ -pipe -fno-exceptions -fno-rtti -fstrict-aliasing

ifndef NDEBUG
LOCAL_CFLAGS += -g -D_DEBUG
else
LOCAL_CFLAGS += -fexpensive-optimizations -O3
endif

ifeq ($(TARGET_ARCH_ABI),x86)
LOCAL_CFLAGS += -fno-stack-protector
endif

LOCAL_C_INCLUDES := ..\\..\\include

LOCAL_SRC_FILES := main.cpp android_tools.cpp

LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid

LOCAL_STATIC_LIBRARIES := Irrlicht android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

# copy Irrlicht data to assets

$(shell mkdir $(IRRLICHT_PROJECT_PATH)\\assets)
$(shell mkdir $(IRRLICHT_PROJECT_PATH)\\assets\\media)
$(shell mkdir $(IRRLICHT_PROJECT_PATH)\\src)
$(shell cp -R $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\Shaders\\ $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\irrlichtlogo3.png $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\dwarf.x $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\dwarf.jpg $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\axe.jpg $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\fonthaettenschweiler.bmp $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
$(shell cp $(IRRLICHT_PROJECT_PATH)\\..\\..\\media\\bigfont.png $(IRRLICHT_PROJECT_PATH)\\assets\\media\\)
- Bạn chép đè nội dung này vào tệp tin Android.mk (trong thư mục jni trong ví dụ 27
- Vậy là Build : NDK-BUILD xong, ANT xong, ADB xong.
- Kết quả đây !
- Chúc các bạn thành công ! 

24/11/14

CustomAnimator !

CustomAnimator  hỗ trợ vật lý 
SoftBody của Bullet !


Đến bây giờ mình đã làm được thêm CstomAnimator hỗ trợ thêm đang tương tác vật liệu mềm (như vãi, cao su) bên cạnh vật thể cứng RigidBody !
Mình cũng làm song song một dạng khác là dùng trực tiếp chuyền sceneNode thành dạng Rigid hay Soft một cách trực tiếp (cách này nhanh như khó lưu và nạp sceneNode, còn cách tạo cuatomAnimator thì lưu và nạp sceneNode hoàn toàn tự động do Irrlicht hỗ trợ)
Mình đang nghên cứu tiếp phần Ragdoll phục vụ cho tư thế hy sinh của nhân vật.
Và thêm một cái nữa là customAnimator hỗ trợ điều khiển nhân vật một cách tự động (máy điều khiển) và nhân công (người chơi điều khiền)
Clip của mình :

27/10/14

Convert Irrlicht SceneNode to Bullet Physic


CHUYỂN SCENENODE TỪ IRRLICHT SANG BULLET 


Từ trước tới giờ mình luôn làm theo chiều thuận, có nghĩa là từ Bullet engine chuyển sang render trong Irrlicht. Nhưng bây giờ mình làm ngược lại : là từ các Mesh có sẳn và cách nạp Mesh rất phong phú của Irrlicht mình chuyển nó qua định dạng của Bullet để có thể tương tác vật lý một cách hoàn hảo.
Bước đầu là mình chuyển các sceneNode  dạng Mesh của Irrlicht sang Bullet. Như clip kèm theo
Bước tiếp theo mình sẽ làm một cái Aminator trong Irrlicht có thể chuyển SceneNode có thể tương tác vật lý . Với cách làm này mình có thể lưu lại màn chơi và nạp lạisau đó một cách đày đủ !
Vậy là chuẩn bị làm game với đầy đủ các tương tác vật lý rồi !
Clip của mình :

Hẹn gạp lại các bạn trong chuyên mục kế tiếp - BulletAnimator !

3/10/14

Control Character in Bullet !

Điều khiển nhân vật trong Bullet !


Lâu quá rồi chưa làm gì hết ! Mới bắt tay làm lại cái này coi sao !
Với phần điều khiển nhân vật chắc chắn là mình sẽ cải tiến từ cái này lên, thêm vào các lựa chọn khác như cho máy tính điều khiển, thêm A* để tìm đường, AI cho các phản ứng.

Buồn ngủ quá ! Relax một chút !

7/5/14

CustomShaderCallBack !

Tạo class chung cho CallBack Shader

 
 

 
 
Các bạn lập trình Irr than mến !
Không biết có bao nhiêu bạn đã đụng đến phần Shader trong Irrlicht chưa ?
Nếu có, có bạn nào rơi vào hoàn cảnh của mình không.
Nguyên nhân là Irrlicht engine có 01 cái ví dụ dành cho dùng cho Shader (ví dụ 10) ! Nhưng khi mình làm việc nhiều với Shader thì với mổi cái ví dụ mình chuyển từ RenderMonkey hay NVidiaFXCompose thì mình đều phải tạo một class kế thừa class ShaderCallBack !
Vậy là bao nhiêu cái ví dụ thì phải có bao nhiêu cái class ???
Mệt quá ! Mình quyết định dùng 01 cái class có thể dùng cho toàn bộ các ví dụ hay là một class  tổng quát có thể Custom cho từng ví dụ riêng được.
Nhưng thực tế thì không dể chút nào,nhưng mình đã đạt được kết quả ban đầu, nói chung là cũng tạm ổn.



Hiện tại mình đang tạo một CustomSceneNode có thể áp Shader cho nó một cách tuỳ thích (nhưng chỉ mới là IMesh, còn IAnimatedMesh thì chưa được. Và những cái Shader dùng RTM thì còn khó hơn nhiêu, đang cố đây !
 Các bạn có thể nghiên cứu theo cách này nhằm rút ngắn time viết code cho khoẻ hé !


ScreenShot :

10/2/14

Connect Anritsu MW9076 to PC (Simulator MW907600A)

Kết nối máy đo quang ODTR Anritsu MW9076 sang máy tính
 
 
- Trên máy đo Anritsu nhớ chỉnh trước cấu hình phù hợp cho cổng COM-1 (Serial COM)
- Trên PC , trong chương trình MW907600A Emulation chọn Option, chỉnh thong số phù hợp cho cổng COM dùng kết nối với máy đó quang Anritsu.

- Cáp nối (rất quang trọng), nhưng cũng khá dể. Chỉ cần lấy cọng cáp xanh của Cisco, cắt bỏ đầu RJ45 hiệu có, bấm ngược lại cho đầu RJ45 mới (chỉ cần lật lại bấm là xong, nhanh không bàn cải). Cái này không ai chỉ mà mình tự tìm ra.
 

- Dùng chức năng FIle -> Remote file transper trong MW907600A. Nhấn nút Connect, nếu máy báo Conneted thì thành công rồi ! (từ PC sang ODTR và ngược lại đều OK)
- Làm gần hết buổi sang nay đó.
Vài ngày nữa mình sẽ đo và lưu lại toàn bộ các tuyến cáp của mình.

6/2/14

Run Irrlicht in Android

Chạy Irrlicht trên Android

Có cách nào để dùng lập trình C++ trên Android không ? (vì Android dùng lập trình Java cho ứng dung)
Tìm muốn chết trên diễn đàn Irrlicht cuối cùng mình cũng bình được. Đó là dùng cái này :
 http://svn.code.sf.net/p/irrlicht/code/branches/ogl-es 
Với các hướng dẫn cụ thể như sau (chính xác  cái hướng dẫn này nằm trong ví dụ 27 của bản Irrlicht dùng cho Opengles.
- Cần phải cài đặt các ứng dung sau :
- Android SDK (from http://developer.android.com)
- Android NDK (from http://developer.android.com)
- ant (a build tool commonly used for Java)
- A Java jdk (for example openjdk-6-jdk)
- GNU Make 3.81 or later
- A recent version of awk
- On Windows you need to have Cygwin (at least version 1.7) installed.

Ngoài ra cần cài thêm các biến môi trường vv...(các bạn cứu xem kỹ trong tệp readme.txt trong ví dụ 27 của nó có rất đầy đủ)
Cuối cùng mình cũng làm cho nó chạy được.Nhưng vẫn chưa hiểu nhiều lắm, mình cần phải học thêm.
Thành quả đây :(Lập trình C++ bang Irrlicht chạy trên Android)
 Mình dùng Eclipse và chạy mô phổng thiết bị android nên còn nhiều lổi chưa fix xong.
 
 

 Hẹn gặp lại các bạn !


22/9/13

Running Irrlicht in Eclipse and MinGW !

Chạy Irrlicht trong Eclipse và MinGW !


Mới chuyển sang lập trình bằng Android dùng Tera của NVDIA nhưng nó lại bắt mình dùng VS2010 pro trở lên !
Tức quá chuyển sang dùng Eclipse và MinGW xem sao ! Thấy cũng ổn và vì đây là FREE IDE nên chuyện bản quyền khỏi lo luôn chi cho mệt.
Mình làm theo hướng dẫn sau : http://irrlicht.sourceforge.net/forum/viewtopic.php?t=25355
Các bước cụ thể như sau ( mình dịch đơn giản thôi) :
1) Download và cài MinGW tại : http://sourceforge.net/projects/mingw/
2) Chú ý cài các biến môi trường cho đúng.
3) Cài Eclipse C++ for C/C++ deverlop : http://www.eclipse.org/downloads/
4) Download và cài Irrlicht (Cái này khỏi bàn thêm vì mình cài rồi)
5) Tạo một project dùng Irrlicht trong Eclipse : Cái này các bạn làm theo hường dẫn nghe ! Rất chính xác rồi.
6) Chép một file mẫu (mình dùng ví dụ 02 của Irrlicht luôn)
- Chú ý loại bỏ dòng #pragma comment(lib, "Irrlicht.lib") (dánh dấu "//" chú thích cho nó là xong)
7) Chọn Project -> Build project
8) Trước khi Run làm thêm cái này đây !
- Vào thư mục cài MinGW chép 02 file : libgcc_s_dw2-1.dll và libstdc++-6.dll vào cùng thư mục (Debug hay Release tùy mình đang chạy)
- Chọn Run -> Run
- Thưởng thức thành quả ! Vậy là xong !
* Phiên bản 1.8 chỉ chạy OpenGL thôi ! Mình đang nghiên cứu cách dịch lại Irrlicht bằng Eclipse để chạy DirectX và cả OpenGL luôn !
* Mình cũng vừa biên dịch các ví dụ của NDK sang chạy bằng Eclipse :



 

20/8/13

Fixed BOOTMGR is compressed. CTRL + ALT + DELETE to restart

Khắc phục lổi bị nén BOOTMGR
Cái này là do mình thôi, để tiết kiệm không gian lưu trữ mình đã nén luôn cái ổ C (chứa hệ điều hành Win7 đang chạy).

 Kết quả là mới vô máy báo " BOOTMGR is compressed. CTRL + ALT + DELETE to restart" cứ như vậy và không có cách nào vào được Window.
Tìm hiểu trên mạng và mình thấy có một cách khắc phục hay nhất là dùng bộ cài Win7 bằng UBS như sau.
Bạn làm như hướn dẫn sau để có thể tạo Usb bootable hé :
http://forum.bkav.com.vn/showthread.php?17979-USB-BOOT-Cai-dat-Win7-bang-2-phan-mem-Windows-7-USB-DVD-Download-Tool-va-WinToFlash
Sau đó khi có Usb boot được thì trở lại máy tính đang bị BOOTMRG compressed làm như sau :
- Chỉnh CMOS để có thể nhận được USB boot cái đã (máy mình phải chọn Usb boot first) lưu lại, khởi động lại, cắm cái USB boot win7 vào
- Chọn repair nhé các bạn
- Nhấn nút Select Driver. Hi đến lúc này thì mình có thể truy cập cái MyComputer rồi, chọn ngay cái ổ C (chứa hệ điều hành mà mình lở checked cái compressed cho nó) , properties, bấm bỏ chọn cái check chết tiệt đó, Apply, chờ một lúc xong, OK.
- Tắt hết các cửa sổ hiện có (nhấn nút X trên cùng bên phải) để thoát trình cài đặt Win7.
- Rút cái USB ra, khởi động lại máy....
- Chờ.... chờ .... màn hình Win7 củ sẽ hiện ra thôi.
- Chỉ như vậy nhưng mình mất hết cả ngày trời (do nghiên cứu tạo USB tự khởi động chạy Win7)
* Hy vọng điều này giúp ít cho các bạn.
* Còn một cách khác là tháo cái ổ HDD ra, đem sang máy khác gắn vào cho nhận thêm, sau đó bỏ dấu checked đúng ngay cái phân vùng mình cần là xong. Nếu bạn nào có USB ổ cứng di động thì làm điều này thật tuyệt vời !

31/7/13

Using Ehternet and RS232 in Android Tablet

Dùng mạng LAN (có dây) và cổng RS232
bằng máy tính bảng Android

Thường hay đi lắp kênh cho khách hàng thường dùng cổng Elthernet để cấu hình cũng như kiểm thử kênh truyền cho khách hàng. Mình nghĩ có cách nào dùng cái máy tính bảng chạy Android cho nó nhẹ nhàng hơn khi phải luôn mang theo một cái PC nặng ỳ.
Vậy là mình quyết định tìm mua cộng dây chuyển này (chú ý nó có biểu tượng Andoid bên dưới nhé)

 
Dùng dây OTG (miniUSB) chuyển sang USB (kèm theo máy) sau đó nối vào cộng dây này và kết nối vào mạng LAN ( đầu RJ45) vậy là xong phần kết nối vật lý.
Cái thứ hai mình cần là cái máy tính bảng của mình cũng có thể nhận cổng Ethernet
(Mình chụp hình bằng Nút nguồn và nút Volume Down trên máy tính bảng)
 

Sau khi cài đúng thì các bạn chú ý có biểu tượng kết nối mạng (hình 2 cái máy tính thu nhỏ) bên dưới cái máy tính bảng của mình (mình đã tắt Wireless, không dùng 3G luôn) .
Các bạn chú ý mình dùng các phần mềm bên dưới hé (Ping, Telnet, SSH, Termial... nhiều lắm)

 
Do mình kết nối với mạng LAN nên phải xem có truy cập Internet được không ? ( cái này kiểm tra kết nối Internet thôi, mình cũng có thể Ping để kiểm tra)
 
 
 
Mình đã Test thử phần dùng Ethernet không có gì phải bàn cải, trên cả tuyệt vời !
 
Kế tiếp là dùng cổng COM /Mình dùng dây chuyển này :

 Đầu cáp OTG ra USB nối với dây chuyển này sau đó đấu vào Modem để cấu hình.
Mình đã Test thành công với Router Cisco 878. Nhưng còn cái khó là đánh lệnh quá khó. Phần mền Terminal không tương thích 100% như trên PC nên gặp một chút khó khăn.
Nhưng như thế này thì đã có thể dùng cái Tablet của mình đi lắp kênh cho khách hàng tốt rồi !
Và nếu dùng cái máy tính bảng này mình cũng có thể vô mạng có dây như bất kỳ cái PC nào khác (không cần phải dùng đến Wireless Network)

6/3/13

PowerPoint presentation with android tablet

Trình chiếu PowerPoint bằng máy tính bảng

 
 
Nếu bạn có một cái máy tính bảng có cổng miniHDMI thì chiếu sang TV LCD  là chuyện bình thường chỉ cầm tìm thêm cộng cáp miniHDMI sang HDMI là nối qua TV thành công


 ! Nhưng, cuộc đời lúc nào cũng chả có chữ nhưng. Nếu bạn muốn trình chiếu bằng cổng VGA (nhất là ở các hội trường, trường học mà cái TV hay máy chiếu treo trên cao và người ta chỉ kéo sẳn cộng cáp VGA) thì sao ?
Giải pháp của mình là : mua tiếp cộng cáp HDMI to VGA

và một đầu nối HDMI loại 2 đầu cái.

Còn một vấn đề nữa là : phải cắm nguồn cho máy tính bảng khi đang trình chiếu nếu không thì vài phút là cái máy tính bảng của bạn sẽ hết pin và tắt ngúm.

Còn vấn đề powerpoint thì sao ?
Mình dùng chương trình spring free : http://www.ispringsolutions.com/ để chuyển tập tin powerPoint (.ppt)  thành dạng MacroMediaFlash (.swf) mang theo đầy đủ các hiệu ứng trên PowerPoint sang Flash.
Chép nó qua máy tính bảng (có nhiều cách qua thẻ nhớ, qua cổng usb qua wifi qua BlueTooth...)
Và dùng chương trình FlashPlayer để hiển thị tệp tin .swf trên máy tính bảng.(mình dùng máy tính bảng Android nên mình lên googlePlay tìm).
Mọi chuyện đã giải quyết xong.

Hy vọng sẽ giúp ích cho các bạn !

26/1/13

Hướng dẫn tích hợp SMFL Audio vào Irrlicht


Hướng dẫn tích hợp SMFL Audio vào Irrlicht

Hiện mình dùng bản 1.5 do nó tương thích bản release và debug

Download SFML : http://www.sfml-dev.org/download.php

Giải nén :

Cài đặt đường dẫn trong VC++ :


Tích hợp trong chương trình Irrlicht :

 

#include

#ifdef _DEBUG

#pragma comment(lib, "sfml-audio-d.lib")//thu vien am thanh SFML debug

#else

#pragma comment(lib, "sfml-audio.lib")//thu vien am thanh SFML release

#endif

#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")

#endif

 

Code :
 //thêm các dòng sau trong tệp tin main.cpp
  sf::Music Music;

     if (!Music.OpenFromFile("footsteps.wav")) return EXIT_FAILURE;

      Music.SetLoop(true);

     // Play the music

    Music.Play();
...
Thêm các thư viện liên kết động vào cùng thư mục chương trình :
libsndfile-1.dll
sfml-audio.dll
sfml-audio-d.dll
sfml-system.dll
sfml-system-d.dll

Vậy là xong !

26/12/12

Tổng hợp một số thủ thuật của Irrlicht


SƯU TẦM CÁC THỦ THUẬT CỦA IRRLICH ENGINE

------o0o---------

Ta có quy định một số biến chuẩn như sau :

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

//

Irr::IrrlichtDevice *device; //khởi tạo bằng hàm CreateDevice hay  CreateDeviceEx

//các biến quy định sau

Irr::video::IVideoDriver* driver = device->getVideoDriver();
Irr::scene::ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* env = device->getGUIEnvironment(); 

stringw caption = L“”; //Dùng để hiện lên thanh tiêu đề của cửa sổ Irrlicht

1)      Hiển thị tốc độ khung hình và driver hiện tại :

        int lastFPS = -1;
        while(device->run())
        {
                if (device->isWindowActive())
                {
                        driver->beginScene(true, true,               video::SColor(255,200,200,200));
                        smgr->drawAll();
                        driver->endScene();
                        int fps = driver->getFPS();
                        if (lastFPS != fps)
                        {
                                core::stringw str = L"driver[";
                                str += driver->getName();
                                str += "] FPS:";
                                str += fps;
                                device->setWindowCaption(str.c_str());
                                lastFPS = fps;
                        }
                }
                else
                        device->yield();
        }

2)      Lấy frameDelta time dùng cho chuyển động cố định bất chấp tốc độ khung hình

        u32 then = device->getTimer()->getTime();
        // This is the movemen speed in units per second.
        const f32 MOVEMENT_SPEED = 5.f;
        while(device->run())
        {
           // Work out a frame delta time.
           const u32 now = device->getTimer()->getTime();
           const f32 frameDeltaTime = (f32)(now - then) / 1000.f;//Time in seconds
           then = now;

 

3)      Cách dùng hàm : getCollisionPoint của class IsceneCollisionManager để tìm kiếm va chạm đối với các SceneNode khác :

Cần có các biến thành phần :

line3df ray;

ITriangleSelector * selector; //cái nào tạo qua hàm CreateTriangleSelector() hay createTriangleSelectorFromBoundingBox() của class IsceneManager

Các biến vector3df thì không cần bàn ( quá dễ)

Chú ý :

const ISceneNode * outNode;

Lúc đó ta dùng hàm này như sau :

Smrg->getSceneCollisionManager()->getCollisionPoint  (ray,  selector, outCollisionPoint, outTriangle,&outNode);

4)      Dùng custom font :

        gui::IGUISkin* skin = env->getSkin();
        gui::IGUIFont* font = env-    >getFont("../../media/fonthaettenschweiler.bmp");
        if (font) skin->setFont(font);

5)      Tạo ScreenShot được lưu theo thời gian lưu:

Dùng hàm sau đây :

void takeScreenshot(irr::IrrlichtDevice* device)

{

   irr::video::IVideoDriver* const driver = device->getVideoDriver();

   //get image from the last rendered frame

   irr::video::IImage* const image = driver->createScreenShot();

   if (image) //should always be true, but you never know. ;)

   {

      //construct a filename, consisting of local time and file extension

      irr::c8 filename[64];

      snprintf(filename,64,"screenshot_%u.png",device->getTimer()->getRealTime());

      //write screenshot to file

      if (!driver->writeImageToFile(image, filename))

         device->getLogger()->log(L"Failed to take screenshot.", irr::ELL_WARNING);

      //Don't forget to drop image since we don't need it anymore.

      image->drop();

   }

}

6)      Chuyển chuổi thành vector hay float hay int :

- Chuyển chuổi thành vector

      vector3df getVectorFromString(stringw str)\\

      {

                  vector3df vector;

                  swscanf(str.c_str(), L"%f %f %f", &vector.X,&vector.Y,&vector.Z );

                  return vector;

      }

- Chuyển chuổi thành int

      int getIntegerFromString(stringw str)\\

      {

                  int integer;

                  swscanf(str.c_str(),L"%i",&integer);

                  return integer;

      }

- Chuyển chuổi thành dạng float :

      f32 getFloatFromString(stringw str)\\

      {

                  f32 decimal;

                  swscanf(str.c_str(),L"%f",&decimal);

                  return decimal;

      }

7)      Chuyển Texture thành Image và ngược lại :

- Chuyển texture thành image :

      video::IImage* image = driver->createImageFromData (

                  texture->getColorFormat(),

                  texture->getSize(),

                  texture->lock(),

                  false  //copy mem

                  );         

Còn cách khác ;

- Chuyển image thành texture :

      video::ITexture* texture = driver->addTexture(name.c_str(),image);

      texture->grab();

8)      Duyệt qua tòan bộ các SceneNode từ Node gốc:

core::array nodes;

smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes); // Find all nodes

for (u32 i=0; i < nodes.size(); ++i)

{

     scene::ISceneNode * node = nodes[i];

     [….]

}

            Còn một cách khác cũng hay là :

            core::list::Iterator begin = node->getChildren().begin();

            core::list::Iterator end   = node->getChildren().end();

             for (; begin != end; ++begin)

            {

               scene::ISceneNode * node = nodes[i];

               […..]

            }

9)      Không cho hiện cửa sổ command window :

      #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")

 

 

10)   Hãm tốc độ khung hình theo yêu cầu (không dùng Vsync do có thể có máy đặt Vsnyc khác nhau như 60 hay 65 hay 75…)

#include

#include

using namespace irr;

 

struct IrrlichtDelayFPS {

  int maxFPS;

  int lastFPS;

  int yieldCounter;

  IrrlichtDevice *device;

  IrrlichtDelayFPS() { maxFPS = 50;  yieldCounter = 0;  device = 0; }

  void delay() {

    video::IVideoDriver* driver = device->getVideoDriver();

    int lastFPS = driver->getFPS();

    for( int i = 0 ; i < yieldCounter ; i++ ) {

      device->yield();

    }

    if ( lastFPS >maxFPS ) { yieldCounter++ ; }

    else {

      if (yieldCounter > 0 ) { --yieldCounter; }

      else { yieldCounter = 0 ; }

    }

  }

};

 

/*  cách dùng

  IrrlichtDelayFPS delayFPS;

  delayFPS.maxFPS = 50; //set max FPS

  delayFPS.device = device; //set device

while(device->run()) {

   //your code here

  //delay loop

  delayFPS.delay();

}

*/

11)   Can thiệp trực tiếp vào dữ liệu của Terrain :

Ta có các biến sau :

IMesh* mesh = terrain->getMesh();

IMeshBuffer* buffer = mesh->getMeshBuffer(0); //chỉ cần mesh buffer 0 là đủ

S3DVertex2TCoords* data = (S3DVertex2TCoords*)buffer-> getVertices();

Giả sử ta có tọa độ vector3df pos(x,y,z) thuộc terrain.

Để hiệu chỉnh đỉnh (vertex) tại vị trí này (ví dụ tăng độ cao đỉnh này lên 10) ta làm như sau :

s32 scale = (s32)terrain->getScale().X ; // chú ý phải scale đầy đủ X, và Z bằng nhau

s32 size = heighmapImage->getDimension().Width; // đây là biến lưu Image của HeightMap.

s32 x = (s32)(pos.X / scale);

s32 z = (s32)(pos.Z / scale);

s32 index = x * size + z;

Và sau củng ta có kết quả hiệu chỉnh như sau :

data[index].pos.Y += 10;

12)   Hàm sinh số ngẫu nhiên tìm ở đâu trong Irrlicht ?

Thật ra có đó. Trong tệp tin os.h có tất cả những cái bạn cần. Mình trích ra như thế này ?

class Randomizer

{

public:

            //! resets the randomizer

            static void reset();

            //! generates a pseudo random number

            static s32 rand();

private:

            static s32 seed;

};

13)   Dùng file nén và có mật khẩu trong Irrlicht :

Khi lập trình thì ai cũng muốn đưa sản phẩm của mình ra, nhưng phần code và resource thì chắc chắn ai cũng muốn dấu rồi (kể cả mình).

Irrlicht đả có hàm để thực hiện chức năng này đó là hàm addFileArchive trong filesystem có tham số như sau:

bool addFileArchive(const path& filename, bool ignoreCase=true,bool ignorePaths=true,E_FILE_ARCHIVE_TYPE archiveType=EFAT_UNKNOWN,

const core::stringc& password="") =0;

      + filename : tên file nén (có thể có password)

      + ignoreCase : bỏ qua chữ hoa hay chữ thường (ví dụ : ant.x vàAnt.X cũng giống nhau)

      + ignorePaths : bỏ qua đường dẫn (bạn chỉ cần cho tên là có thể tìm ra nó trong file nén của mình dù nó nằm trong các thư mục khác nhau. Chú ý đều này)

      + archiveType : Irrlicht hỗ trợ các loại file nén sau : pkzip, gzip,folder ảo, pak,npk,tar.

      + password : mật khẩu của tệp tin nén và nó được mã hóa 256 bit.

* Mình dùng như sau : dùng 7Zip nén toàn bộ resource của mình thành một tệp tin nén (loại zip) có password mà mình định trước và theo chuẩn bzip2 và mã hóa theo theo chuẩn AES-256. Vậy là mình tạm thời có thể yên tâm về resource mình kèm theo game rồi !!

14)  Dùng file âm thanh nén với Audiere :

Mặc định Audiere không chấp nhận file nén, nhưng ta có cách khắc phục như sau :

- // them phan nay de chay file Zip

                  irr::io::IFileSystem* fs = m_smgr->getFileSystem();

                  irr::io::IReadFile* rf = fs->createAndOpenFile(filename);

                  if (!rf)

                  {

                              printf("**Not found audio file: %s\n",filename);

                              return;

                  }         

                  //

                  audiere::OutputStreamPtr au_stream = 0;

                  //

                  if (zip_audio) ////dung file audio nen

                  {

                              core::arraybuffer;                  

                              buffer.set_used(rf->getSize());

                              rf->read(buffer.pointer(),rf->getSize());                    

                              audiere::FilePtr mf = audiere::CreateMemoryFile(buffer.pointer(),rf->getSize());               

                              buffer.clear(); 

                              rf->drop();//close file

                              au_stream = audiere::OpenSound(m_audevice,mf,true,audiere::FF_AUTODETECT);            

                  }

                  else //khong nen Audio

                              au_stream = audiere::OpenSound(m_audevice,filename,true,audiere::FF_AUTODETECT);

15)   Custom SceneNode hay Custom Animator có tham chiếu với SceneNode khác :

Giả sử bạn tạo SceneNode trong đó có tham chiếu đến terrain hay SceneNodeAnimator (dĩ niên là phải dính đến scenenode tham chiếu của nó rồi, nhưng ngoài ra nó còn tham chiếu đến địa hình) thì khi lưu và nạp game bạn sẽ gặp phải vấn đề chết người đó là : nó sẽ báo lổi không biết bạn tham chiếu đến sceneNode nào ? (do lúc đó scenenode đó chưa được nạp).

Cách giải quyết thế nào : thứ nhất bạn phải đặt ID cho SceneNode được tham chiếu đó để SceneNode của bạn biết cách mà tìm nó. Và cái thứ 2 quan trọng hơn là bạn hãy thêm vào biến Init như là giá trị khởi tạo. Biến này chỉ là true khi Node đã được tạo hết (khi đến phần render của Node hay animateNode của SceneNodeAnimator). Như vậy vấn đề được giải quyết xong.

16)   Một số các thủ thuật với GUI :

a)      GUI skin : cần nắm vững nếu muốn tối ưu GUI

-          Lấy Skin hiện thời : Guienv->getSkin()

-          Đặt skin làm skin hiện tại cho GUI : gui->setSkin()

b)      Lấy và đổi màu giao diện : skin->getColor() và skin->setColor() : có thể lấy và đỏi màu hay làm trong suốt một phần hay toàn bộ các GUI hiện tại.

c)      Đổi nội dung văn bản mặc đang hiển thị trong GUI: skin->setDefaultText()

- như đổi tên chữ Yes hay No hay Ok hay Cancel trên MsgBox thành Đúng, sai, Đồng ý, Hủy chọn - > vậy là mình có thể việt hóa hoàn toàn GUI

d)     Thay đổi kích thước mắc định của các phần tử trong GUI : độ lớn của Button, độ lớn của ScrollBar…

e)      Còn rất nhiều phần khác trong GUI mà bạn có thể nghiên cứu trong Skin

17)   Làm cho một node canh chỉnh theo Normal map của địa hình

-          Lấy Normal map của địa hình

-          Normal.normalize(); //Chuẩn hóa nó

-          core::matrix4 trans = character->getRelativeTransformation();//lấy ma trận chuyển vị của Node mà mình muốn quay

-          vector3df oldX(1,0,0); //vị trí đi tới mắc định           

-          trans.rotateVect(oldX); //quay vị trí đi tới thành vị trí hiện thời

-          oldX.normalize(); //chuẩn hóa nó

-          core::vector3df nForward = oldX.crossProduct(Normal); //Lấy vector pháp của vector đang đi tới hiện tại với vector Normal

-          if (nForward.getLength()==0) nForward = vector3df (Normal.Y, Normal.X, Normal.Z) ; //Nếu Normal trùng với hướng di chuyển hiện tại

-          core::vector3df nFRote = nForward.getHorizontalAngle(); //lấy gốc quay quanh trục Y của nForward.

-          character->setRotation(nFRote); //quay Node đi theo vector nFRote vậy là xong.

18)  Quay một Node thành BillBoard :

-  // make billboard look to camera

      core::vector3df pos = getAbsolutePosition();

      core::vector3df campos = camera->getAbsolutePosition();

      core::vector3df target = camera->getTarget();

      core::vector3df up = camera->getUpVector();

      core::vector3df view = target - campos;

      view.normalize();

      core::vector3df horizontal = up.crossProduct(view);

      if ( horizontal.getLength() == 0 )

      {

                  horizontal.set(up.Y,up.X,up.Z);

      }

      horizontal.normalize();

      horizontal *= 0.5f * Size.Width;

      core::vector3df vertical = horizontal.crossProduct(view);

      vertical.normalize();

      vertical *= 0.5f * Size.Height;

      view *= -1.0f;

      for (s32 i=0; i<4 i="i" span="span">

                  vertices[i].Normal = view;

 

      vertices[0].Pos = pos + horizontal + vertical;

      vertices[1].Pos = pos + horizontal - vertical;

      vertices[2].Pos = pos - horizontal - vertical;

      vertices[3].Pos = pos - horizontal + vertical;

19)  Sinh Terrain động từ bộ nhớ :

heightMap= myDriver->createImage(video::ECF_A8R8G8B8,dimension2du(257,257));

heightMap->fill(SColor(0,0,0,0));

ge.Generate_LandScape_A(heightMap,52);

ge.FilterToCloud(0,255,3,heightMap);

ge.Emboss(1,5,heightMap);

//dữ liệu trong Memory

c8* imageData=new c8[heightMap->getImageDataSizeInBytes()];

io::IWriteFile* memWriteFile =myDevice->getFileSystem()->createMemoryWriteFile(imageData,heightMap->getImageDataSizeInBytes(),"tempFile.bmp");

//sao chép qua bộ nhớ

myDriver->writeImageToFile(heightMap,memWriteFile);

//lưu lại trên HD để dùng khi nạp lại

myDriver->writeImageToFile(heightMap,"Map.bmp");

//tạo file truy suất đọc trong Memory

io::IReadFile* rf = myDevice->getFileSystem()->createMemoryReadFile(imageData,heightMap->getImageDataSizeInBytes(),"Map.bmp");

//Tạo Terrain như bình thường

if (terrain!=0) terrain->remove();

terrain = mySmgr->addTerrainSceneNode(rf,0,-1,vector3df(0,0,0),vector3df(0,0,0),vector3df(200,50,200),SColor(255,255,255,255));  

20)   CÁC LƯU Ý KHI CHUYỂN SHADER CODE TỪ RENDER MONKEY SANG IRRLICHT

a)      hệ trục tọa độ khác nhau : trục Y và Z sẽ chuyển thành Z và Y

b)      Phép nhân ma trận : các ví dụ mẫu trong RM thì đúng (khi add default) nhưng các ví dụ còn lại sẳn có thì phép nhân ma trận bị sai :

Out.Pos = mul(view_proj_matrix, Pos);

Sẽ thành :

Out.Pos = mul(Pos , view_proj_matrix);  // trong Irrlicht

c)      Ma trận bị Invert : một số ma trận như ViewMatrix hay ViewInvMatrix khi chuyển qua Irrlicht phải bị Invert trước một lần nữa.

d)     3D Noise Texture :

- Do Irrlicht không hỗ trợ định dạng này (3D Texture) mà chỉ có 2D Texture nên phải dùng công thức chuyển đổi (nhưng phải linh hoạt trong nhiều trường hợp)

- Một lệnh Tex3D trong RM sẽ tương ứng với 2 lệnh Tex2D và một lệnh lerp trong Irrlicht.

e)      CUBEMAP : Irrlicht cũng không hỗ trợ định dạng này, nên ta cũng phải thực hiện chuyển đổi (nhất là khi dùng Reflection từ môi trường) bằng cách dùng Liner View. (Xem ví dụ về Refraction để biết)

f)       Hằng số : các hằng số khai trước đều không có tác dụng trong Irrlicht, nên chuyển các hằng số này vào trong thân hàm.


21)  LƯU Ý KHI SCALE NODE LÀ FILE BSP :

      Một SceneNode được tạo nên từ Mesh bsp (như QUAKE) khi dùng lệnh node->setScale() sẽ bị lổi khi render (bị mất đa giác của meshkhi nhìn ở các hướng khác nhau
      Để khắc phục ta không scale từ sceneNode mà trực tiếp từ mesh bằng hàm scale() trong IMeshManipulator* ( từ smgr->getMeshManipulator()) như vậy là thành công không còn lổi render.
 
22) HIỂN THỊ COMPOUND OBJECT TỪ BULLET SANG IRRLICHT:
Với đối tượng là Compound ta dùng ngay emptySceneNode thay thế nó để hiển thị
Các đối tượng khác là child của nó thì dùng bình thường và nó cũng là child (trong sceneNode của Irrlicht) như vậy thì hiển thị SceneNode dạy diện cho các Object của Bullet dạng Compound mới chính xác (Ví dụ : ForkLiftDemo)
23)


 

 

 

Bài đăng phổ biến