boost::polygon::point_3d_data と D3DXVECTOR3 の変換
Boost.Polygonの謎 id:nagoya313:20100921
こんな感じ?
#include <iostream> #include <d3dx9.h> #include <boost/polygon/polygon.hpp> #include <boost/array.hpp> #include <boost/range/algorithm/for_each.hpp> #include <boost/range/adaptor/transformed.hpp> #include <pstade/oven/copied.hpp> typedef boost::polygon::point_3d_data<float> point_3d_t; typedef D3DXVECTOR3 d3d_vec3_t; // D3DXVECTOR3 -> boost::polygon::point_3d_data<float> point_3d_t d3d_vec3_to_point_3d(const d3d_vec3_t& src){ return point_3d_t(src.x, src.y, src.z); } // boost::polygon::point_3d_data<float> -> D3DXVECTOR3 d3d_vec3_t point_3d_to_d3d_vec3(const point_3d_t& src){ namespace gtl = boost::polygon; return d3d_vec3_t(gtl::x(src), gtl::y(src), gtl::z(src)); } int main(){ namespace oven = pstade::oven; namespace adaptors = boost::adaptors; namespace gtl = boost::polygon; boost::array<d3d_vec3_t, 4> d3d_array = { D3DXVECTOR3(0.0f, 0.0, 0.0f), D3DXVECTOR3(1.0f, 0.0, 0.0f), D3DXVECTOR3(0.0f, 1.0, 0.0f), D3DXVECTOR3(0.0f, 0.0, 1.0f), }; std::vector<point_3d_t> point_3d_array; // D3DXVECTOR3 -> polygon::point_3d_data point_3d_array = d3d_array |adaptors::transformed(d3d_vec3_to_point_3d) // 型を変換して |oven::copied; // コピー // 出力 boost::for_each(point_3d_array, [](const point_3d_t& pos){ namespace gtl = boost::polygon; std::cout << gtl::x(pos) << ", " << gtl::y(pos) << ", " << gtl::z(pos) << std::endl; }); // polygon::point_3d_data -> D3DXVECTOR3 d3d_array = point_3d_array |adaptors::transformed(point_3d_to_d3d_vec3) |oven::copied; return 0; }
出力:
0, 0, 0 1, 0, 0 0, 1, 0 0, 0, 1
adaptors::transformed を使って、ベクトルの型を変換している。
adaptors::transformed をもう1回使えば、バッファにコピーしないで直接、point_3d_data を操作できそう。
と、ここまで書いたんだけど Polygon で何が出来るのかいまいち理解していない。
個人的にあまりゲーム向けじゃない気がするんだけどどうなんだろう。
座標変換とかは全部 VRAM でやっちゃうし、当たり判定も物理エンジンの方がいい気がするし。
誰か日本語でまとめて。
今後の活躍に期待なのかなー。