CHƯƠNG 1: CÔNG NGHỆ VR VỚI THƯƠNG MẠI ĐIỆN TỬ VÀ QUẢNG BÁ SẢN PHẨM TRÊN NỀN WEB
1.4. Giới thiệu OpenSceneGraph (OSG)
1.4.6. Các tiện ích và các lớp khác
Thư viện osg chứa nhiều lớp và tiện ích hữu ích. Đề cập đến một vài lớp và tiện ích đó cùng với sự tham khảo OSG – tính được lược đồ bộ nhớ giúp tránh được sự rò rỉ bộ nhớ bằng cách xóa bộ nhớ không liên quan.
1.4.6.1. Lớp Referenced
Lớp Referenced là lớp cơ bản cho hầu hết các nút scene graph và nhiều đối tượng khác trong OSG. Nó chứa một tài liệu tham khảo để kiểm tra cách sử dụng bộ nhớ. Nếu một đối tượng của một kiểu được suy ra từ Referenced thì tài liệu tham khảo của nó đạt được là con số 0, sự phá hủy của đối tượng được gọi và bộ nhớ liên quan đến đối tượng được xóa. Lớp Referenced thực hiện một khối được tính thử lại của bộ nhớ. Hầu hết các node OSG và dữ liệu scene graph, bao gồm thông tin về trạng thái và mảng các đỉnh, các pháp tuyến, và các tọa độ bề mặt lấy từ lớp Referenced. Và kết quả là, hầu hết bộ nhớ OSG scene graph đều được tính thử lại.
Có ba thành phần chính thỏa mãn lớp Referenced:
Nó chứa một biến thành viên tính thử lại kiểu số nguyên đã được bảo vệ, _refCount được khởi tạo là 0 trong hàm tạo lớp.
Nó chứa các phương thức công khai ref() và unref(), phương thức tăng và giảm _refCount. Unref() xóa bộ nhớ của đối tượng sử dụng khi _refCount đạt đến 0.
Hàm tạo lớp là hàm nằm trong mục bảo vệ và là hàm ảo. Sự tạo lập trên ngăn xếp và sự hủy bỏ dứt khoát là không thể bởi vì hàm hủy đã được bảo vệ và sự khai báo hàm ảo cho phép phân lớp các hàm hủy để thực thi.
1.4.6.2. Lớp ref_ptr<>
Lớp mẫu ref_ptr<> định nghĩa một con trỏ thông minh đến đối số mẫu của nó. Đối số mẫu phải được suy ra từ lớp Referenced hoặc hỗ trợ một mạch ghép nối đồng nhất tính mốc quy chiếu. Khi địa chỉ của một đối tượng được phân công cho ref_ptr<>, đối tượng tham khảo đếm số gia một cách tự động. Một cách
ref_ptr<> (namespace: osg) thực thi một con trỏ thông minh tới một đối tượng kiểu Referenced, và quản lý tính thử lại của nó. Đối tượng Referenced được đảm bảo để xóa nó khi biến ref_ptr<> cuối cùng liên quan đến nó tiến hành ref_ptr<> giảm sự phá hủy của bộ nhớ scene graph, và đảm bảo sự phá hủy đối tượng trong lúc một ngoại lệ gọi trả lại ngăn xếp.
Có bốn thành phần chính thỏa mãn lớp khuôn mẫu ref_ptr<>:
Nó chứa một con trỏ riêng, _ptr, để lưu trữ địa chỉ bộ nhớ được quản lý. Phương thức get() trả lại giá trị của _ptr.
Nó chứa nhiều phương thức cho phép mã sử dụng ref_ptr<> như một con trỏ C++ thông thường, chẳng hạn operator->() và operator=().
Phương thức valid() cho giá trị là true nếu ref_ptr<> là non-Null.
Khi mã gán một địa chỉ tới một biến ref_ptr<>, toán tử gán ref_ptr<>, operator=(), giả dụ địa chỉ trỏ tới một đối tượng được lấy từ Referenced, và tự động tăng tính thử lại bằng cách gọi phương thức Referenced::ref().
Có hai trạng thái khi một biến ref_ptr<> giảm tính thử lại trong lúc ref_ptr<> hủy bỏ (trong hàm tạo lớp)và trong lúc gán lại (trong operator=()).
Trong cả hai trường hợp, ref_ptr<> giảm tính thử lại bằng cách gọi phương thức Referenced::unref().
1.4.6.3. Lớp đối tượng (Object)
Lớp Object ảo thuần túy là lớp cơ bản cho bất kỳ đối tượng nào trong OSG yêu cầu sự hỗ trợ vào/ra, sự bắt chước, tính mốc quy chiếu. Hầu hết các lớp nút và nhiều đối tượng khác trong OSG được suy ra từ Object.
1.4.6.4. Thông báo (Notify)
Thư viện osg cung cấp một tập các hàm cho việc điều chỉnh lỗi, cảnh báo, và lỗi đầu ra. Kiểm soát số lượng đầu ra bằng cách chỉ định một trong các giá trị đếm được của NotifySeverity. Hầu hết các mô đun mã hóa bên trong OSG hiển thị các thông tin thông báo.
1.4.6.5. File I/ O
Những phần trước mô tả các kỹ thuật theo thứ tự đối với việc tạo đồ thị cảnh cùng với hình học và trạng thái, và tất cả các ứng dụng tạo một vài hình học
theo thứ tự. Tuy nhiên, ứng dụng thường tải và hiển thị các mô hình lớn và phức tạp từ tập tin. Các ứng dụng yêu cầu một chức năng mà load một mô hình từ tập tin và trả lại nó như một đồ thị cảnh được xây dựng lại.
Thư viện osgDB cung cấp một giao diện mà cho phép ứng dụng đọc và ghi các file ảnh 2D và mô hình 3D. osgDB quản lý hệ thống đầu vào OSG để hỗ trợ các loại file khác. Các ví dụ trong phần này sử dụng osgDB đối với tập tin I/O. Tất cả các ví dụ sử dụng đầu vào .osg để ghi đồ thị cảnh tới một tập tin .osg.
Ví dụ Lighting sử dụng đầu vào .osg để tải một đồ thị con từ một file tên là lozenge.osg, và ví dụ TextureMapping sử dụng đầu vào .png để tải ảnh bề mặt của nó. Phần này mô tả các đầu vào chi tiết hơn bởi vậy có thể sử dụng chúng một cách hiệu quả trong ứng dụng. Nó mô tả giao diện đối với việc tạo và ghi các file, cách OSG tìm kiếm các file, và cách OSG chọn các đầu vào để load các file đó.
Giao diện: osgDB cung cấp một giao diện tập tin I/O mà hoàn toàn ẩn dưới hệ thống đầu vào từ ứng dụng. Hai file đầu trang osgDB định nghĩa giao diện này.
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
Để sử dụng osgDB cho các tập tin I/O trong ứng dụng, bao gồm các file đầu trang trong mã nguồn. Định nghĩa một vài chức năng trong namespace cho việc thực hiện tập tin I/O.
Đọc các file: Hàm osgDB::readNodeFile() và osgDB::readImageFile() để đọc các file mô hình 3D và các file ảnh 2D.
osg::Node* osgDB::readNodeFile( const std::string& filename );
osg::Image* osgDB::readImageFile( const std::string& filename );
Sử dụng readNodeFile() để tải một file mô hình 3D. OSG chấp nhận loại file từ mở rộng tên file và sử dụng các đầu vào phù hợp để chuyển file sang một đồ thị cảnh. readNodeFile() trả ứng dụng một con trỏ trỏ tới nút gốc của đồ thị
cảnh. Một cách tương tự, readImageFile() load các file ảnh 2D và trả lại một con trỏ tới đối tượng Image.
Tham số tên file có thể chứa một đường dẫn tuyệt đối hoặc đường dẫn tương đối. Nếu xác định một đường dẫn tuyệt đối, OSG tìm tập tin trong một vị trí cụ thể. Nếu tên file chứa đường dẫn tương đối (hoặc chỉ chứa một tên file), OSG tìm kiếm file sử dụng danh sách đường dẫn file dữ liệu osgDB. Người sử dụng có thể thiết lập danh sách của thư mục này sử dụng biến môi trường OSG_FILE_PATH.
Để thêm thư mục dữ liệu cụ thể để danh sách đường dẫn tập tin dữ liệu, sử dụng chức năng osgDB::Registry::getDataFilePathList(). osgDB::Registry là phần duy nhất gọi hàm này, truy cập trường hợp cá biệt duy nhất. Hàm này trả lại một tham chiếu tới một osgDB::FilePathList, là một std::deque<std::string> đơn giản. Ví dụ, để thêm một thư viện lưu trữ trong đường dẫn mới chuỗi, sử dụng dòng mã sau:
osgDB::Registry::instance()->getDataFilePathList().push_back( newpath ).
Nếu OSG không thể tải file với bất kỳ lý do nào, tất cả các hàm trả lại con trỏ NULL. Để xác định tại sao file không load được, thiết lập biến môi trường OSG_NOTIFY_LEVEL thành một mức dài dòng cao hơn (chẳng hạn như WARN), cố gắng để tải lại file, và kiểm tra các cảnh báo hoặc thông điệp lỗi được hiển thị trong bàn điều khiển của ứng dụng.
Ghi các file: Hàm osgDB::writeNodeFile() và osgDB::writeImageFile() để ghi dữ liệu các file mô hình 3D và các file ảnh 2D.
bool osgDB::writeNodeFile(const osg::Node& node,const std::string&
filename );
bool osgDB::writeImageFile(const osg::Image& image,const std::string& filename );
Nếu OSG không thể ghi các file với bất kỳ lý do nào, các hàm đó trả về giá trị là false. Lặp lại, thiết lập OSG_NOTIFY_LEVEL cho cảnh báo để xem
các thông điệp tại sao bị lỗi. Nếu ghi thao tác thành công, các hàm đó trả về giá trị true.
Nếu tham số tên file chứa một đường dẫn tuyệt đối, writeNodeFile() và writeImageFile() cố gắng ghi file đó vào vị trí tuyệt đối. Nếu tên file chứa một đường dẫn tương đối (hoặc không phải hai loại đường dẫn trên), các hàm đó cố gắng để ghi file tương đối đó đến thư mục hiện tại.
OSG ghi đè một file đang tồn tại cùng với một tên tương tự mà không cảnh báo. Để ngăn chặn hành vi này, ứng dụng nên kiểm tra các file đang tồn tại và đưa ra một hành động phù hợp.
Tóm lại:
Thương mại điện tử là lĩnh vực hoạt động giao dịch thương mại nhờ ứng dụng sự phát triển của công nghệ thông tin. Đặc biệt là lĩnh vực quảng cáo trên nền web, có nhiều hình thức thể hiện sản phẩm, trong đó có hình thức ứng dụng công nghệ thực tại ảo để mô phỏng sản phẩm trên nền web.
Áp dụng công nghệ thực tại ảo sẽ mô phỏng sản phẩm dưới dạng 3D tương tác, sản phẩm ảo này có đặc tính giống như sản phẩm ngoài thực tế. Người sử dụng có thể tương tác với sản phẩm ảo thông qua hệ thống tương tác của công nghệ thông tin ngay tại nhà mình mà không phải đi tới công ty. Điều này tạo lên sự thuận lợi và tiết kiệm chi phí đi lại cho khách hàng. Sản phẩm ảo này sẽ được đưa lên trang web để quảng bá với nền tảng là trình duyệt Firefox.
Mô phỏng sản phẩm ta sẽ sử dụng thư viện đồ họa mã nguồn mở. Thư viện này có nhiều hàm, phương thức hỗ trợ cho lập trình viên lập trình trở lên dễ dàng hơn so với sử dụng những hàm API mức thấp.