|
| |
|
このページではDXライブラリの3D表現を扱うための主な関数の説明と簡単な サンプルプログラムを載せています。 | |
|
3D図形描画関係関数 | |
| DrawLine3D | 3D空間に線分を描画する |
| DrawTriangle3D | 3D空間に三角形を描画する |
| DrawSphere3D | 3D空間に球を描画する |
| DrawCapsule3D | 3D空間にカプセルを描画する |
| DrawCone3D | 3D空間に円錐を描画する |
| DrawBillboard3D | 3D空間に画像を描画する |
| DrawModiBillboard3D | 3D空間に2次元的な変形を加えた画像を描画する |
| DrawPolygon3D | 3D空間に三角形ポリゴンの集合を描画する |
| DrawPolygonIndexed3D | 3D空間に三角形ポリゴンの集合を描画する(インデックス) |
| SetMaterialUseVertDifColor | 3D図形描画のライティング計算に頂点データのディフューズカラーを使用するかどうかを設定する |
| SetMaterialUseVertSpcColor | 3D図形描画のライティング計算に頂点データのスペキュラカラーを使用するかどうかを設定する |
| SetMaterialParam | 3D図形描画のライティング計算に使用するマテリアルパラメータを設定する |
| SetUseZBuffer3D | Zバッファを使用するかどうかを設定する |
| SetWriteZBuffer3D | Zバッファに書き込みを行うかどうかを設定する |
| SetUseBackCulling | ポリゴンのバックカリングを使用するかどうかを設定する |
| SetTextureAddressModeUV | テクスチャアドレスモードを設定する |
| SetFogEnable | フォグを有効にするかどうかを設定する |
| SetFogColor | フォグの色を変更する |
| SetFogStartEnd | フォグが始まる距離と終了する距離を設定する |
| GetColorF | 浮動小数点型のカラー値を取得する |
| GetColorU8 | 符号なし整数8ビットのカラー値を取得する |
|
カメラ関数 | |
| SetCameraNearFar | カメラの 手前クリップ距離と 奥クリップ距離を設定する |
| SetCameraPositionAndTarget_UpVecY | カメラの視点、注視点を設定する( 上方向はY軸から算出 ) |
| SetCameraPositionAndTargetAndUpVec | カメラの視点、注視点、上方向を設定する |
| SetCameraPositionAndAngle | カメラの視点、垂直回転角度、水平回転角度、捻り回転角度を設定する |
| SetCameraViewMatrix | ビュー行列を直接設定する |
| SetupCamera_Perspective | 遠近法カメラをセットアップする |
| SetupCamera_Ortho | 正射影カメラをセットアップする |
| SetupCamera_ProjectionMatrix | 射影行列を設定する |
| SetCameraDotAspect | カメラのドットアスペクト比を設定する |
| ConvWorldPosToScreenPos | ワールド座標をスクリーン座標に変換する |
| ConvScreenPosToWorldPos | スクリーン座標をワールド座標に変換する |
| SetCameraScreenCenter | 画面上でのカメラが見ている映像の中心座標を設定する |
| CheckCameraViewClip | 指定の座標がカメラの視界に入っていないかどうかを判定する |
| CheckCameraViewClip_Box | 二つの座標で表されるボックスがカメラの視界に入っていないかどうかを判定する |
| GetCameraViewMatrix | カメラのビュー行列を取得する |
| GetCameraProjectionMatrix | カメラの射影行列を取得する |
|
ライト関数 | |
| SetUseLighting | ライティング計算処理を使用するかどうかを設定する |
| SetGlobalAmbientLight | グローバルアンビエントライトカラーを設定する |
|
標準ライト関数 | |
| ChangeLightTypeDir | 標準ライトのタイプをディレクショナルライトにする |
| ChangeLightTypePoint | 標準ライトのタイプをポイントライトにする |
| ChangeLightTypeSpot | 標準ライトのタイプをスポットライトにする |
| SetLightEnable | 標準ライトの有効、無効をセットする |
| SetLightDifColor | 標準ライトのディフューズカラーを設定する |
| SetLightSpcColor | 標準ライトのスペキュラカラーを設定する |
| SetLightAmbColor | 標準ライトのアンビエントカラーを設定する |
| SetLightDirection | 標準ライトの方向を設定する |
| SetLightPosition | 標準ライトの位置を設定する |
| SetLightRangeAtten | 標準ライトの有効距離と距離減衰パラメータを設定する |
| SetLightAngle | 標準ライトの照射角度パラメータを設定する |
| GetLightType | 標準ライトのタイプを取得する |
| GetLightEnable | 標準ライトの有効、無効を取得する |
| GetLightDifColor | 標準ライトのディフューズカラーを取得する |
| GetLightSpcColor | 標準ライトのスペキュラカラーを取得する |
| GetLightAmbColor | 標準ライトのアンビエントカラーを取得する |
| GetLightDirection | 標準ライトの向きを取得する |
| GetLightPosition | 標準ライトの位置を取得する |
| GetLightRangeAtten | 標準ライトの有効距離と距離減衰パラメータを取得する |
| GetLightAngle | 標準ライトの照射角度パラメータを取得する |
|
ライトハンドル関数 | |
| CreateDirLightHandle | ディレクショナルタイプのライトハンドルを作成する |
| CreatePointLightHandle | ポイントタイプのライトハンドルを作成する |
| CreateSpotLightHandle | スポットタイプのライトハンドルを作成する |
| DeleteLightHandle | ライトハンドルを削除する |
| DeleteLightHandleAll | ライトハンドルを全て削除する |
| SetLightTypeHandle | ライトハンドルのタイプを変更する |
| SetLightEnableHandle | ライトハンドルのライトの有効、無効を設定する |
| SetLightDifColorHandle | ライトハンドルのライトのディフューズカラーを設定する |
| SetLightSpcColorHandle | ライトハンドルのライトのスペキュラカラーを設定する |
| SetLightAmbColorHandle | ライトハンドルのライトのアンビエントカラーを設定する |
| SetLightDirectionHandle | ライトハンドルのライトの方向を設定する |
| SetLightPositionHandle | ライトハンドルのライトの位置を設定する |
| SetLightRangeAttenHandle | ライトハンドルのライトの有効距離と距離減衰パラメータを設定する |
| SetLightAngleHandle | ライトハンドルのライトの照射角度パラメータを設定する |
| GetLightTypeHandle | ライトハンドルのライトのタイプを取得する |
| GetLightEnableHandle | ライトハンドルのライトの有効、無効を取得する |
| GetLightDifColorHandle | ライトハンドルのライトのディフューズカラーを取得する |
| GetLightSpcColorHandle | ライトハンドルのライトのスペキュラカラーを取得する |
| GetLightAmbColorHandle | ライトハンドルのライトのアンビエントカラーを取得する |
| GetLightDirectionHandle | ライトハンドルのライトの方向を取得する |
| GetLightPositionHandle | ライトハンドルのライトの位置を取得する |
| GetLightRangeAttenHandle | ライトハンドルのライトの有効距離と距離減衰パラメータを取得する |
| GetLightAngleHandle | ライトハンドルのライトの照射角度パラメータを取得する |
| GetEnableLightHandleNum | 有効になっているライトハンドルの数を取得する |
| GetEnableLightHandle | 有効になっているライトハンドルを取得する |
|
算術演算関数 | |
| VGet | ベクトルを取得する |
| VAdd | 二つのベクトルを加算する |
| VSub | 二つのベクトルを減算する |
| VDot | 二つのベクトルの内積を取得する |
| VCross | 二つのベクトルの外積を取得する |
| VScale | ベクトルのスケーリングをする |
| VSize | ベクトルのサイズを取得する |
| VSquareSize | ベクトルのサイズの2乗を取得する |
| VNorm | 正規化ベクトルを取得する |
| VTransform | 行列を使ったベクトルの変換 |
| VTransformSR | 行列を使ったベクトルの変換( スケーリング+回転成分のみ ) |
| MGetIdent | 単位行列を取得する |
| MGetScale | 拡大行列を取得する |
| MGetTranslate | 平行移動行列を取得する |
| MGetRotX | X軸回転行列を取得する |
| MGetRotY | Y軸回転行列を取得する |
| MGetRotZ | Z軸回転行列を取得する |
| MGetRotAxis | 指定軸で指定角度回転する行列を取得する |
| MGetRotVec2 | ある向きからある向きへ変換する回転行列を取得する |
| MGetAxis1 | 指定の3軸上のベクトルを基本軸上のベクトルに変換する行列を取得する |
| MGetAxis2 | 基本軸上のベクトルを指定の3軸上のベクトルに変換する行列を取得する |
| MAdd | 二つの行列の足し算を行う |
| MMult | 二つの行列の乗算を行う |
| MScale | 行列のスケーリングを行う |
| MTranspose | 転置行列を取得する |
| MInverse | 逆行列を取得する |
|
衝突検出系関数 | |
| Segment_Segment_MinLength | 二つの線分の最近点間の距離を得る |
| Segment_Triangle_MinLength | 線分と三角形の最近点間の距離を得る |
| Segment_Point_MinLength | 線分と点の一番近い距離を得る |
| HitCheck_Line_Triangle | 三角形と線分の当たり判定 |
|
3Dモデル関係の関数 | |
|
モデルの読み込み・複製関係の関数 | |
| MV1LoadModel | モデルの読み込み |
| MV1DuplicateModel | 指定のモデルと同じ基礎データを使用してモデルを作成する |
| MV1DeleteModel | モデルを削除する |
| MV1SetLoadModelUsePhysicsMode | 読み込むモデルの物理演算モードを設定する |
| MV1SetLoadModelPhysicsWorldGravity | 読み込むモデルの物理演算に適用する重力パラメータを設定する |
|
モデル描画関数 | |
| MV1DrawModel | モデルを描画する |
| MV1DrawFrame | モデルの指定のフレームを描画する |
| MV1DrawMesh | モデルの指定のメッシュを描画する |
| MV1DrawTriangleList | モデルの指定のトライアングルリストを描画する |
|
モデル描画設定関数 | |
| MV1SetUseOrigShader | モデルの描画にオリジナルシェーダープログラムを使用するかどうかを設定する |
| MV1SetSemiTransDrawMode | モデルの半透明要素がある部分についての描画モードを設定する |
|
モデル基本制御関数 | |
| MV1SetPosition | モデルの座標をセットする |
| MV1GetPosition | モデルの座標を取得する |
| MV1SetScale | モデルの拡大値をセットする |
| MV1GetScale | モデルの拡大値を取得する |
| MV1SetRotationXYZ | モデルの回転値をセットする |
| MV1GetRotationXYZ | モデルの回転値を取得する |
| MV1SetRotationZYAxis | モデルのZ軸とY軸の方向をセットする |
| MV1SetMatrix | モデルの座標変換用行列をセットする |
| MV1GetMatrix | モデルの座標変換用行列を取得する |
| MV1SetVisible | モデルを描画するかどうかを変更する |
| MV1GetVisible | モデルを描画するかどうかを取得する |
| MV1SetDifColorScale | モデルのディフューズカラーのスケール値を設定する |
| MV1GetDifColorScale | モデルのディフューズカラーのスケール値を取得する |
| MV1SetSpcColorScale | モデルのスペキュラカラーのスケール値を設定する |
| MV1GetSpcColorScale | モデルのスペキュラカラーのスケール値を取得する |
| MV1SetEmiColorScale | モデルのエミッシブカラーのスケール値を設定する |
| MV1GetEmiColorScale | モデルのエミッシブカラーのスケール値を取得する |
| MV1SetAmbColorScale | モデルのアンビエントカラーのスケール値を設定する |
| MV1GetAmbColorScale | モデルのアンビエントカラーのスケール値を取得する |
| MV1GetSemiTransState | モデルに半透明要素があるかどうかを取得する |
| MV1SetOpacityRate | モデルの不透明度を設定する |
| MV1GetOpacityRate | モデルの不透明度を取得する |
| MV1SetUseZBuffer | モデルを描画する際にZバッファを使用するかどうかを設定する |
| MV1SetWriteZBuffer | モデルを描画する際にZバッファに書き込みを行うかどうかを設定する |
| MV1SetUseVertDifColor | モデル描画のライティング計算に頂点データのディフューズカラーを使用するかどうかを設定する |
| MV1SetUseVertSpcColor | モデル描画のライティング計算に頂点データのスペキュラカラーを使用するかどうかを設定する |
| MV1PhysicsCalculation | モデルの物理演算を指定時間分経過したと仮定して計算する |
| MV1PhysicsResetState | モデルの物理演算の状態をリセットする |
|
アニメーション関数 | |
| MV1AttachAnim | アニメーションをアタッチする |
| MV1DetachAnim | アニメーションをデタッチする |
| MV1SetAttachAnimTime | アタッチしているアニメーションの再生時間を設定する |
| MV1GetAttachAnimTime | アタッチしているアニメーションの再生時間を取得する |
| MV1GetAttachAnimTotalTime | アタッチしているアニメーションの総時間を取得する |
| MV1SetAttachAnimBlendRate | アタッチしているアニメーションのブレンド率を設定する |
| MV1GetAttachAnimBlendRate | アタッチしているアニメーションのブレンド率を取得する |
| MV1GetAttachAnim | アタッチしているアニメーションのアニメーション番号を取得する |
| MV1GetAnimNum | アニメーションの数を取得する |
| MV1GetAnimName | 指定番号のアニメーション名を取得する |
| MV1GetAnimIndex | 指定名のアニメーション番号を取得する |
| MV1GetAnimTotalTime | 指定番号のアニメーションの総時間を得る |
|
マテリアル関数 | |
| MV1GetMaterialNum | モデルで使用しているマテリアルの数を取得する |
| MV1GetMaterialName | 指定のマテリアルの名前を取得する |
| MV1SetMaterialDifColor | 指定のマテリアルのディフューズカラーを変更する |
| MV1GetMaterialDifColor | 指定のマテリアルのディフューズカラーを取得する |
| MV1SetMaterialSpcColor | 指定のマテリアルのスペキュラカラーを変更する |
| MV1GetMaterialSpcColor | 指定のマテリアルのスペキュラカラーを取得する |
| MV1SetMaterialEmiColor | 指定のマテリアルのエミッシブカラーを変更する |
| MV1GetMaterialEmiColor | 指定のマテリアルのエミッシブカラーを取得する |
| MV1SetMaterialAmbColor | 指定のマテリアルのアンビエントカラーを変更する |
| MV1GetMaterialAmbColor | 指定のマテリアルのアンビエントカラーを取得する |
| MV1SetMaterialSpcPower | 指定のマテリアルのスペキュラの強さを変更する |
| MV1GetMaterialSpcPower | 指定のマテリアルのスペキュラの強さを取得する |
| MV1GetMaterialDifMapTexture | 指定のマテリアルでディフューズマップとして使用されているテクスチャ番号を取得する |
| MV1GetMaterialSpcMapTexture | 指定のマテリアルでスペキュラマップとして使用されているテクスチャ番号を取得する |
| MV1GetMaterialNormalMapTexture | 指定のマテリアルで法線マップとして使用されているテクスチャ番号を取得する |
| MV1SetMaterialDrawBlendMode | 指定のマテリアルの描画ブレンドモードを変更する |
| MV1GetMaterialDrawBlendMode | 指定のマテリアルの描画ブレンドモードを取得する |
| MV1SetMaterialDrawBlendParam | 指定のマテリアルの描画ブレンドパラメータを変更する |
| MV1GetMaterialDrawBlendParam | 指定のマテリアルの描画ブレンドパラメータを取得する |
| MV1SetMaterialOutLineWidth | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線の太さを設定する |
| MV1GetMaterialOutLineWidth | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線の太さを取得する |
| MV1SetMaterialOutLineDotWidth | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線のドット単位の太さを設定する |
| MV1GetMaterialOutLineDotWidth | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線のドット単位の太さを取得する |
| MV1SetMaterialOutLineColor | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線の色を設定する |
| MV1GetMaterialOutLineColor | 指定のマテリアルのトゥーンレンダリングで使用する輪郭線の色を取得する |
|
テクスチャ関係 | |
| MV1GetTextureNum | モデルで使用されているテクスチャの数を取得する |
| MV1GetTextureName | テクスチャの名前を取得する |
| MV1SetTextureGraphHandle | テクスチャとして使用するグラフィックハンドルを変更する |
| MV1GetTextureGraphHandle | テクスチャのグラフィックハンドルを取得する |
| MV1SetTextureAddressMode | テクスチャのアドレスモードを変更する |
| MV1GetTextureAddressModeU | テクスチャのU値のアドレスモードを取得する |
| MV1GetTextureAddressModeV | テクスチャのV値のアドレスモードを取得する |
| MV1SetTextureSampleFilterMode | テクスチャのフィルタリングモードを変更する |
| MV1GetTextureSampleFilterMode | テクスチャのフィルタリングモードを取得する |
|
フレーム関数 | |
| MV1GetFrameNum | フレームの数を取得する |
| MV1SearchFrame | 指定名のフレームをモデル中から検索する |
| MV1SearchFrameChild | 指定名のフレームを指定のフレームの子フレームの中から検索する |
| MV1GetFrameName | フレームの名前を取得する |
| MV1GetFrameParent | フレームの親フレームを取得する |
| MV1GetFrameChildNum | フレームの子フレームの数を取得する |
| MV1GetFrameChild | フレームの子フレームを取得する |
| MV1GetFramePosition | フレームの座標を取得する |
| MV1GetFrameLocalMatrix | フレームの座標変換行列を取得する |
| MV1GetFrameLocalWorldMatrix | フレームのローカル座標からワールド座標に変換する行列を取得する |
| MV1SetFrameUserLocalMatrix | フレームの座標変換行列を設定する |
| MV1ResetFrameUserLocalMatrix | フレームの座標変換行列をデフォルトに戻す |
| MV1SetFrameVisible | フレームの表示・非表示状態を変更する |
| MV1GetFrameVisible | フレームの表示・非表示状態を取得する |
| MV1SetFrameDifColorScale | フレームのディフューズカラーのスケール値を設定する |
| MV1GetFrameDifColorScale | フレームのディフューズカラーのスケール値を取得する |
| MV1SetFrameSpcColorScale | フレームのスペキュラカラーのスケール値を設定する |
| MV1GetFrameSpcColorScale | フレームのスペキュラカラーのスケール値を取得する |
| MV1SetFrameEmiColorScale | フレームのエミッシブカラーのスケール値を設定する |
| MV1GetFrameEmiColorScale | フレームのエミッシブカラーのスケール値を取得する |
| MV1SetFrameAmbColorScale | フレームのアンビエントカラーのスケール値を設定する |
| MV1GetFrameAmbColorScale | フレームのアンビエントカラーのスケール値を取得する |
| MV1GetFrameSemiTransState | フレームに半透明要素があるかどうかを取得する |
| MV1SetFrameOpacityRate | フレームの不透明度を設定する |
| MV1GetFrameOpacityRate | フレームの不透明度を取得する |
| MV1SetFrameTextureAddressTransform | フレームのテクスチャ座標変換パラメータを設定する |
| MV1ResetFrameTextureAddressTransform | フレームのテクスチャ座標変換パラメータをリセットする |
| MV1GetFrameTriangleNum | フレームに含まれるポリゴンの数を取得する |
| MV1GetFrameMeshNum | フレームに含まれるメッシュの数を取得する |
| MV1GetFrameMesh | フレームに含まれるメッシュを取得する |
|
メッシュ関数 | |
| MV1GetMeshNum | モデルに含まれるメッシュの数を取得する |
| MV1GetMeshMaterial | メッシュが使用しているマテリアルの番号を取得する |
| MV1GetMeshTriangleNum | メッシュに含まれる三角形ポリゴンの数を取得する |
| MV1SetMeshVisible | メッシュの表示・非表示状態を変更する |
| MV1GetMeshVisible | メッシュの表示・非表示状態を取得する |
| MV1SetMeshDifColorScale | メッシュのディフューズカラーのスケール値を設定する |
| MV1GetMeshDifColorScale | メッシュのディフューズカラーのスケール値を取得する |
| MV1SetMeshSpcColorScale | メッシュのスペキュラカラーのスケール値を設定する |
| MV1GetMeshSpcColorScale | メッシュのスペキュラカラーのスケール値を取得する |
| MV1SetMeshEmiColorScale | メッシュのエミッシブカラーのスケール値を設定する |
| MV1GetMeshEmiColorScale | メッシュのエミッシブカラーのスケール値を取得する |
| MV1SetMeshAmbColorScale | メッシュのアンビエントカラーのスケール値を設定する |
| MV1GetMeshAmbColorScale | メッシュのアンビエントカラーのスケール値を取得する |
| MV1SetMeshOpacityRate | メッシュの不透明度を設定する |
| MV1GetMeshOpacityRate | メッシュの不透明度を取得する |
| MV1SetMeshDrawBlendMode | メッシュの描画ブレンドモードを設定する |
| MV1GetMeshDrawBlendMode | メッシュの描画ブレンドモードを取得する |
| MV1SetMeshDrawBlendParam | メッシュの描画ブレンドパラメータを設定する |
| MV1GetMeshDrawBlendParam | メッシュの描画ブレンドパラメータを取得する |
| MV1SetMeshBackCulling | メッシュのバックカリングを行うかどうかを設定する |
| MV1GetMeshBackCulling | メッシュのバックカリングを行うかどうかを取得する |
| MV1GetMeshMaxPosition | メッシュに含まれる頂点のローカル座標での最大値を取得する |
| MV1GetMeshMinPosition | メッシュに含まれる頂点のローカル座標での最小値を取得する |
| MV1GetMeshTListNum | メッシュに含まれるトライアングルリストの数を取得する |
| MV1GetMeshTList | メッシュに含まれるトライアングルリストを取得する |
| MV1GetMeshSemiTransState | メッシュに半透明要素があるかどうかを取得する |
| MV1SetMeshUseVertDifColor | メッシュの頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかを設定する |
| MV1GetMeshUseVertDifColor | メッシュの頂点ディフューズカラーをマテリアルのディフューズカラーの代わりに使用するかどうかの設定を取得する |
| MV1SetMeshUseVertSpcColor | メッシュの頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかを設定する |
| MV1GetMeshUseVertSpcColor | メッシュの頂点スペキュラカラーをマテリアルのスペキュラカラーの代わりに使用するかどうかの設定を取得する |
|
トライアングルリスト関数 | |
| MV1GetTriangleListNum | モデルに含まれるトライアングルリストの数を取得する |
| MV1GetTriangleListVertexType | トライアングルリストの頂点データタイプを取得する |
| MV1GetTriangleListPolygonNum | トライアングルリストに含まれるポリゴンの数を取得する |
| MV1GetTriangleListVertexNum | トライアングルリストに含まれる頂点の数を取得する |
|
コリジョン( 衝突判定 )関数 | |
| MV1SetupCollInfo | コリジョン情報を構築する |
| MV1TerminateCollInfo | コリジョン情報の後始末をする |
| MV1RefreshCollInfo | コリジョン情報を更新する |
| MV1CollCheck_Line | 線分とモデルの当たり判定 |
| MV1CollCheck_Sphere | 球とモデルの当たり判定 |
| MV1CollCheck_Capsule | カプセルとモデルの当たり判定 |
| MV1CollCheck_GetResultPoly | 当たり判定結果ポリゴン配列から指定番のポリゴン情報を取得する |
| MV1CollResultPolyDimTerminate | 当たり判定結果ポリゴン配列の後始末をする |
|
参照用メッシュ関数 | |
| MV1SetupReferenceMesh | 参照用メッシュのセットアップ |
| MV1TerminateReferenceMesh | 参照用メッシュの後始末をする |
| MV1RefreshReferenceMesh | 参照用メッシュを更新する |
| MV1GetReferenceMesh | 参照用メッシュを取得する |
|
プログラマブルシェーダー関係関数 | |
| GetValidShaderVersion | 使用できるシェーダーのバージョンを取得する |
| GetMultiDrawScreenNum | 同時に描画を行うことができる画面の数を取得する |
| LoadVertexShader | 頂点シェーダーバイナリを読み込みシェーダーハンドルを作成する |
| LoadPixelShader | ピクセルシェーダーバイナリを読み込みシェーダーハンドルを作成する |
| DeleteShader | シェーダーハンドルを削除する |
| InitShader | シェーダーハンドルを全て削除する |
| SetVSConstF | 頂点シェーダーの FLOAT4 型定数を設定する |
| SetVSConstFMtx | 頂点シェーダーの FLOAT4 型定数に行列を設定する |
| SetVSConstFArray | 頂点シェーダーの FLOAT4 型定数を配列を使って設定する |
| ResetVSConstF | 頂点シェーダーの FLOAT4 型定数の設定を無効にする |
| SetPSConstF | ピクセルシェーダーの FLOAT4 型定数を設定する |
| SetPSConstFMtx | ピクセルシェーダーの FLOAT4 型定数に行列を設定する |
| SetPSConstFArray | ピクセルシェーダーの FLOAT4 型定数を配列を使って設定する |
| ResetPSConstF | ピクセルシェーダーの FLOAT4 型定数の設定を無効にする |
| SetRenderTargetToShader | 描画先を設定する |
| SetUseTextureToShader | シェーダー描画で使用するテクスチャを設定する |
| SetUseVertexShader | シェーダー描画に使用する頂点シェーダーを設定する |
| SetUsePixelShader | シェーダー描画に使用するピクセルシェーダーを設定する |
| DrawPolygon2DToShader | シェーダーを使って2Dポリゴンを描画する |
| DrawPolygon3DToShader | シェーダーを使って3Dポリゴンを描画する |
| DrawPolygonIndexed2DToShader | シェーダーを使って2Dポリゴンを描画する(インデックスを使用) |
| DrawPolygonIndexed3DToShader | シェーダーを使って3Dポリゴンを描画する(インデックスを使用) |
|
シャドウマップ関係関数 | |
| MakeShadowMap | シャドウマップを作成する |
| DeleteShadowMap | シャドウマップを削除する |
| SetShadowMapLightDirection | シャドウマップへの描画で想定するライトの方向を設定する |
| ShadowMap_DrawSetup | シャドウマップへの描画の準備を行う |
| ShadowMap_DrawEnd | シャドウマップへの描画を終了する |
| SetUseShadowMap | 描画で使用するシャドウマップを変更する |
| SetShadowMapDrawArea | シャドウマップに描画する範囲を設定する |
| SetShadowMapAdjustDepth | シャドウマップを使用した3Dモデル描画時の深度判定の補正値を設定する |
| TestDrawShadowMap | シャドウマップを画面にテスト描画する |
| 3D図形描画関数 | ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に線分を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3D空間上に線分を描画する
DrawLine3D( VGet( 100.0f, 100.0f, 0.0f ), VGet( 300.0f, 200.0f, 0.0f ), GetColor( 255,255,255 ) ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に三角形を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3D空間上に三角形を描画する
DrawTriangle3D(
VGet(100.0f,100.0f, 0.0f),
VGet(500.0f,400.0f, 0.0f),
VGet(600.0f,100.0f,100.0f), GetColor( 255,255,255 ), FALSE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に球を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// 3D空間上に球を描画する
DrawSphere3D( VGet( 320.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上にカプセルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// 3D空間上にカプセルを描画する
DrawCapsule3D( VGet( 320.0f, 100.0f, 0.0f ), VGet( 320.0f, 300.0f, 0.0f ), 40.0f, 8, GetColor( 0,255,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に円錐を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// 3D空間上に円錐を描画する
DrawCone3D( VGet( 320.0f, 400.0f, 0.0f ), VGet( 320.0f, 100.0f, 0.0f ), 80.0f, 16, GetColor( 0,0,255 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に画像を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GrHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 画像の読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// 3D空間上に画像を描画
DrawBillboard3D( VGet( 320.0f, 240.0f, 100.0f ), 0.5f, 0.5f, 120.0f, 0.0f, GrHandle, TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に変形画像を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GrHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 画像の読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// 3D空間上に画像を描画
DrawModiBillboard3D( VGet( 320.0f, 240.0f, 100.0f ),
-100.0f, 200.0f,
100.0f, 200.0f,
100.0f, -200.0f,
-100.0f, -200.0f, GrHandle, TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上にポリゴンを2つ描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3D Vertex[ 6 ] ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 2ポリゴン分の頂点のデータをセット
Vertex[ 0 ].pos = VGet( 100.0f, 100.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 250.0f, 100.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 0.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( 100.0f, 300.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 0,255,255,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 0.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( 400.0f, 200.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 0,255,255,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 0.0f ;
Vertex[ 3 ].v = 0.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
Vertex[ 4 ].pos = VGet( 600.0f, 400.0f, 0.0f ) ;
Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 4 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4 ].u = 0.0f ;
Vertex[ 4 ].v = 0.0f ;
Vertex[ 4 ].su = 0.0f ;
Vertex[ 4 ].sv = 0.0f ;
Vertex[ 5 ].pos = VGet( 500.0f, 50.0f, 0.0f ) ;
Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 5 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 5 ].u = 0.0f ;
Vertex[ 5 ].v = 0.0f ;
Vertex[ 5 ].su = 0.0f ;
Vertex[ 5 ].sv = 0.0f ;
// 2ポリゴンの描画
DrawPolygon3D( Vertex, 2, DX_NONE_GRAPH, FALSE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に4つの頂点データを使用してポリゴンを2つ描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3D Vertex[ 4 ] ;
WORD Index[ 6 ] ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 4頂点分のデータをセット
Vertex[ 0 ].pos = VGet( 100.0f, 100.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 250.0f, 100.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 0.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( 100.0f, 300.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 0,255,255,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 0.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( 400.0f, 200.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 0,255,255,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 0.0f ;
Vertex[ 3 ].v = 0.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
// 2ポリゴン分のインデックスデータをセット
Index[ 0 ] = 0 ;
Index[ 1 ] = 1 ;
Index[ 2 ] = 2 ;
Index[ 3 ] = 3 ;
Index[ 4 ] = 2 ;
Index[ 5 ] = 1 ;
// 2ポリゴンの描画
DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に標準の設定( 頂点データのディフューズカラーを使用する )で球を描画した後、 頂点データのディフューズカラーを使用しない設定にして、マテリアルのディフューズカラーを 黄色にした上で再度球を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATERIALPARAM Material ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// デフォルトの設定で3D空間上に球を描画する
DrawSphere3D( VGet( 160.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// 頂点データのディフューズカラーを使用しないようにする
SetMaterialUseVertDifColor( FALSE ) ;
// マテリアルのディフューズカラーを黄色にする
Material.Diffuse = GetColorF( 1.0f, 1.0f, 0.0f, 1.0f ) ;
Material.Specular = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Ambient = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Emissive = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Power = 20.0f ;
SetMaterialParam( Material ) ;
// 再度3D空間上に球を描画する( 引数 DifColor の値は無視されます )
DrawSphere3D( VGet( 480.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間上に標準の設定( 頂点データのスペキュラカラーを使用する )で球を描画した後、 頂点データのスペキュラカラーを使用しない設定にして、マテリアルのスペキュラカラーを 黄色にした上で再度球を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATERIALPARAM Material ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// デフォルトの設定で3D空間上に球を描画する
DrawSphere3D( VGet( 160.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// 頂点データのスペキュラカラーを使用しないようにする
SetMaterialUseVertSpcColor( FALSE ) ;
// マテリアルのスペキュラカラーを黄色にする
Material.Diffuse = GetColorF( 0.0f, 0.0f, 0.0f, 1.0f ) ;
Material.Specular = GetColorF( 1.0f, 1.0f, 0.0f, 0.0f ) ;
Material.Ambient = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Emissive = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Power = 20.0f ;
SetMaterialParam( Material ) ;
// 再度3D空間上に球を描画する( 引数 SpcColor の値は無視されます )
DrawSphere3D( VGet( 480.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル マテリアルの設定で自己発光色を暗い青色にした上で球を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATERIALPARAM Material ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// マテリアルの自己発光色を暗い青色にする
Material.Diffuse = GetColorF( 0.0f, 0.0f, 0.0f, 1.0f ) ;
Material.Specular = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Ambient = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Emissive = GetColorF( 0.0f, 0.0f, 0.5f, 0.0f ) ;
Material.Power = 20.0f ;
SetMaterialParam( Material ) ;
// デフォルトの設定で3D空間上に球を描画する
DrawSphere3D( VGet( 320.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル Zバッファを有効にしない状態で球を描画した後、Zバッファを有効にして 更にZバッファへの書き込みも行う設定にして再度球を描画します。 Zバッファを有効にしない状態では球の奥の面が手前の面より後に描画される関係で 正しい描画結果が得られません。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// デフォルトの設定で3D空間上に球を描画する
DrawSphere3D( VGet( 160.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// Zバッファを有効にした状態で再度3D空間上に球を描画する
DrawSphere3D( VGet( 480.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル Zバッファを有効にしない状態で球を描画した後、Zバッファを有効にして 再度球を描画します。 Zバッファを有効にしない状態では球の奥の面が手前の面より後に描画される関係で 正しい描画結果が得られません。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// デフォルトの設定で3D空間上に球を描画する
DrawSphere3D( VGet( 160.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// Zバッファを有効にする
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D( TRUE ) ;
// Zバッファを有効にした状態で再度3D空間上に球を描画する
DrawSphere3D( VGet( 480.0f, 200.0f, 0.0f ), 80.0f, 32, GetColor( 128,0,0 ), GetColor( 255,255,255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 画面右側にバックカリングを無効の状態で、画面左側にバックカリングを有効にした状態でそれぞれ球を描画します。 Zバッファを使用しない状態なのでバックカリングを有効にしていない画面右側の球は裏面のポリゴンが表面のポリゴンの 後に描画されるという現象が発生するので見た目が破綻しますが、バックカリングを有効にした状態で描画している画面左側の 球は裏面のポリゴンが描画されないのでZバッファを有効にしていない状態でも正常な見た目で描画されます。 ( 因みにバックカリングを行うことで見た目的に正常な描画結果が得られるのは描画するポリゴン集合にへこんだ部分がない場合のみです )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// バックカリングなしで3D空間上に球を描画する
DrawSphere3D( VGet( 500.0f, 200.0f, 0.0f ), 80.0f, 8, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ) ;
// バックカリングを有効にする
SetUseBackCulling( TRUE ) ;
// バックカリングありで3D空間上に球を描画する
DrawSphere3D( VGet( 140.0f, 200.0f, 0.0f ), 80.0f, 8, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル テクスチャのアドレスモードをU方向を DX_TEXADDRESS_WRAP に、V方向を DX_TEXADDRESS_MIRROR にした上で テクスチャサイズの3倍のテクスチャ座標を使ってポリゴンを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3D Vertex[ 6 ] ;
int GrHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// ポリゴンに貼り付ける画像の読みこみ
GrHandle = LoadGraph( "Kao.bmp" ) ;
// テクスチャのアドレスモードをU方向を DX_TEXADDRESS_WRAP に
// V方向を DX_TEXADDRESS_MIRROR に設定
SetTextureAddressModeUV( DX_TEXADDRESS_WRAP, DX_TEXADDRESS_MIRROR ) ;
// 2ポリゴン分の頂点のデータをセット
Vertex[ 0 ].pos = VGet( 100.0f, 400.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 500.0f, 400.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 3.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( 100.0f, 100.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 3.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( 500.0f, 100.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 3.0f ;
Vertex[ 3 ].v = 3.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
Vertex[ 4 ].pos = VGet( 100.0f, 100.0f, 0.0f ) ;
Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 4 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4 ].u = 0.0f ;
Vertex[ 4 ].v = 3.0f ;
Vertex[ 4 ].su = 0.0f ;
Vertex[ 4 ].sv = 0.0f ;
Vertex[ 5 ].pos = VGet( 500.0f, 400.0f, 0.0f ) ;
Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 5 ].dif = GetColorU8( 255,255,255,255 ) ;
Vertex[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 5 ].u = 3.0f ;
Vertex[ 5 ].v = 0.0f ;
Vertex[ 5 ].su = 0.0f ;
Vertex[ 5 ].sv = 0.0f ;
// 2ポリゴンの描画
DrawPolygon3D( Vertex, 2, GrHandle, FALSE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル フォグ機能を有効にした状態でモデルを画面から徐々に離しながら4体描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, i ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// フォグを有効にする
SetFogEnable( TRUE ) ;
// フォグの色を黄色にする
SetFogColor( 255, 255, 0 ) ;
// フォグの開始距離を0、終了距離を1500にする
SetFogStartEnd( 0.0f, 1500.0f ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面を黄色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 255, 255, 0 ), TRUE ) ;
// 3Dモデルを徐々に画面から離しながら4体描画する
for( i = 0 ; i < 4 ; i ++ )
{
// モデルの座標をセット
MV1SetPosition( ModelHandle, VGet( 700.0f, -300.0f, 200.0f + i * 400.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル フォグ機能を有効にした状態でモデルを画面から徐々に離しながら4体描画します。 フォグの色を黒にしているので徐々に暗闇に消えていくように見えます
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, i ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// フォグを有効にする
SetFogEnable( TRUE ) ;
// フォグの色を黒色にする
SetFogColor( 0, 0, 0 ) ;
// フォグの開始距離を0、終了距離を1500にする
SetFogStartEnd( 0.0f, 1500.0f ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 3Dモデルを徐々に画面から離しながら4体描画する
for( i = 0 ; i < 4 ; i ++ )
{
// モデルの座標をセット
MV1SetPosition( ModelHandle, VGet( 700.0f, -300.0f, 200.0f + i * 400.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル フォグ機能を有効にした状態でフォグの開始距離を1000、終了距離を3500に変更した上で モデルを画面から徐々に離しながら8体描画します。 SetFogEnable のサンプルプログラムと違い、フォグの色が掛かり始めるのが3体目からになっています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, i ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// フォグを有効にする
SetFogEnable( TRUE ) ;
// フォグの色を黄色にする
SetFogColor( 255, 255, 0 ) ;
// フォグの開始距離を1000、終了距離を3500にする
SetFogStartEnd( 1000.0f, 3500.0f ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面を黄色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 255, 255, 0 ), TRUE ) ;
// 3Dモデルを画面から徐々に離しながら8体描画する
for( i = 0 ; i < 8 ; i ++ )
{
// モデルの座標をセット
MV1SetPosition( ModelHandle, VGet( 700.0f, -300.0f, 200.0f + i * 400.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル GetColorF 関数を使用している関数 SetLightDifColor 等のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetColorU8 関数を使用している関数 DrawPolygon3D 等のサンプルを参照してください。 | ||||||||||||||
| カメラ関数 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo を画面奥方向に座標をずらして8つ描画して、 方向キーの上下で Far の値を、左右で Near の値を変更できるサンプルプログラムです。 クリップ値を変更することで描画される範囲が変わるのが分かります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, i ;
float Near, Far ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// Near Far 値の初期化
Near = 100.0f ;
Far = 2000.0f ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 上下のキー入力で Far を操作
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
Far += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
Far -= 20.0f ;
}
// 左右のキーで Near を操作
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
Near -= 20.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
Near += 20.0f ;
}
// Near の値が 0.0f 以下になっていたら補正
if( Near <= 0.0f ) Near = 10.0f ;
// Far の値が Near より小さくなっていたら補正
if( Far <= Near ) Far = Near + 10.0f ;
// Near, Far クリップの距離を設定
SetCameraNearFar( Near, Far ) ;
// モデルを距離を変えて8個描画
for( i = 0 ; i < 8 ; i ++ )
{
// モデルの座標を設定
MV1SetPosition( ModelHandle, VGet( 320.0f, 180.0f, 100.0f + i * 400.0f ) ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
}
// 画面左上に Near の値と Far の値を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Near %f Far %f", Near, Far ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo を原点に描画した状態で、カメラの位置を方向キーで 操作できるようにしたサンプルプログラムです。 カメラは常に原点を注視点としていますのでモデルは常に画面中心に表示されますが、 キー入力によって見える角度が変わります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
VECTOR CameraPos ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの座標を初期化
CameraPos.x = 0.0f ;
CameraPos.y = 0.0f ;
CameraPos.z = -800.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 方向キーでカメラの座標を移動
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
CameraPos.y += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
CameraPos.y -= 20.0f ;
}
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
CameraPos.x -= 20.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
CameraPos.x += 20.0f ;
}
// カメラの位置と注視点をセット、注視点は原点
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo を原点に配置して、左右キーでそのモデルを見ている カメラの上の方向を回転できるようにしたサンプルプログラムです。
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float Roll ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの視線の回転値を初期化
Roll = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 左右キーでカメラの回転値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
Roll -= DX_PI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
Roll += DX_PI_F / 60.0f ;
}
// カメラの位置と注視点をセット
// 視点はZ軸のマイナス800の位置
// 注視点は原点
// 上方向は Roll の値から算出
SetCameraPositionAndTargetAndUpVec(
VGet( 0.0f, 0.0f, -800.0f ),
VGet( 0.0f, 0.0f, 0.0f ),
VGet( sin( Roll ), cos( Roll ), 0.0f ) ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル カメラの向きを上下左右キーで変えられるようにしたサンプルです。 回転していることを確認できるようにモデルファイル SimpleModel.mqo をカメラを囲むように 4個描画しています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float VRotate, HRotate, TRotate ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの回転値を初期化
VRotate = 0.0f ;
HRotate = 0.0f ;
TRotate = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 左シフトキーを押しているかどうかで処理を分岐
if( CheckHitKey( KEY_INPUT_LSHIFT ) == 1 )
{
// 左右キーでカメラの捻り方向回転値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
TRotate -= DX_PI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
TRotate += DX_PI_F / 60.0f ;
}
}
else
{
// 左右キーでカメラの水平方向回転値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
HRotate -= DX_PI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
HRotate += DX_PI_F / 60.0f ;
}
}
// 上下キーでカメラの垂直方向回転値を変更
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
VRotate += DX_PI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
VRotate -= DX_PI_F / 60.0f ;
}
// カメラの位置と回転値をセット、カメラの位置は原点
SetCameraPositionAndAngle( VGet( 0.0f, 0.0f, 0.0f ), VRotate, HRotate, TRotate ) ;
// モデルをカメラを囲むように4個描画
MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 800.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, -800.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 800.0f, 0.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( -800.0f, 0.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル カメラの向きを左右キーで変えられるようにしたサンプルです。 回転していることを確認できるようにモデルファイル SimpleModel.mqo をカメラを囲むように 4個描画しています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float Rotate ;
MATRIX Matrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの回転値を初期化
Rotate = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 左右キーでカメラの回転値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
Rotate -= DX_PI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
Rotate += DX_PI_F / 60.0f ;
}
// 回転値を使用してY軸の回転行列を作成
Matrix = MGetRotY( Rotate ) ;
// 回転行列をビュー行列としてセット
SetCameraViewMatrix( Matrix ) ;
// モデルをカメラを囲むように4個描画
MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 800.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, -800.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 800.0f, 0.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( -800.0f, 0.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル カメラの視野角を左右キーで変えられるようにしたサンプルです。 視野角が変化していることを確認できるようにモデルファイル SimpleModel.mqo をカメラの前方に 3個描画しています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float Fov ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 視野角を初期化
Fov = 60.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 左右キーで視野角の値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
Fov -= 2.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
Fov += 2.0f ;
}
// 視野角が 8.0f 以下になったら補正
if( Fov < 8.0f ) Fov = 8.0f ;
// 視野角が 170.0f 以上になったら補正
if( Fov > 170.0f ) Fov = 170.0f ;
// 遠近法のセットアップ( ラジアン値に変換しています )
SetupCamera_Perspective( Fov * DX_PI_F / 180.0f ) ;
// カメラの前方にモデルを3個描画
MV1SetPosition( ModelHandle, VGet( -1400.0f + 320.0f, 240.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 0.0f + 320.0f, 240.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 1400.0f + 320.0f, 240.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 表示方式を正射影に変えてからカメラの前方に奥行き値の違うモデルを3つ描画します。 正射影なので奥行き的に何処に位置していても同じ大きさで描画されます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// カメラを正射影に変更
SetupCamera_Ortho( 2000.0f ) ;
// カメラの前方に奥行き座標の違うモデルを3個描画
MV1SetPosition( ModelHandle, VGet( -700.0f + 320.0f, 240.0f, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 0.0f + 320.0f, 240.0f, 500.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1SetPosition( ModelHandle, VGet( 700.0f + 320.0f, 240.0f, 1000.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ドットアスペクト比の設定を縦2倍にしてからモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ドット比を縦に2倍に変更
SetCameraDotAspect( 0.5f ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル DxChara.x の0番目のモーションを再生しながら、フレーム番号26の座標に2Dの四角形を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex ;
float TotalTime, PlayTime ;
VECTOR ScreenPos ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
// 何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 再生時間を進める
PlayTime += 100.0f ;
// 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す
if( PlayTime >= TotalTime )
{
PlayTime = 0.0f ;
}
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ナンバー26のフレームの画面上での座標を取得する
ScreenPos = ConvWorldPosToScreenPos( MV1GetFramePosition( ModelHandle, 26 ) ) ;
// 取得したスクリーン座標に四角形を描画
DrawBox( ScreenPos.x - 2, ScreenPos.y - 2, ScreenPos.x + 2, ScreenPos.y + 2, GetColor( 255,0,0 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 画面上に表示されているモデルファイル SimpleModel.mqo のポリゴンとマウスポインタの位置から 画面奥へ伸びる線分とで当たり判定を行い、線分に接触したポリゴンを黄色で描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
VECTOR StartPos, EndPos ;
MV1_COLL_RESULT_POLY HitPoly ;
int Mx, My ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデル全体のコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// マウスの座標を取得
GetMousePoint( &Mx, &My ) ;
// マウスポインタがある画面上の座標に該当する3D空間上の Near 面の座標を取得
StartPos = ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) ;
// マウスポインタがある画面上の座標に該当する3D空間上の Far 面の座標を取得
EndPos = ConvScreenPosToWorldPos( VGet( Mx, My, 1.0f ) ) ;
// モデルと線分との当たり判定
HitPoly = MV1CollCheck_Line( ModelHandle, -1, StartPos, EndPos ) ;
// 当たったかどうかで処理を分岐
if( HitPoly.HitFlag == 1 )
{
// 当たった場合は衝突の情報を描画する
// 当たったポリゴンを黄色で描画する
DrawTriangle3D( HitPoly.Position[ 0 ], HitPoly.Position[ 1 ], HitPoly.Position[ 2 ], GetColor( 255,255,0 ), TRUE ) ;
// 交差した座標を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Pos %f %f %f",
HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ;
// 当たったポリゴンが含まれるフレームの番号を描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Frame %d", HitPoly.FrameIndex ) ;
// 当たったポリゴンが使用しているマテリアルの番号を描画
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Material %d", HitPoly.MaterialIndex ) ;
// 当たったポリゴンを形成する三頂点の座標を描画
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Position %f %f %f",
HitPoly.Position[ 0 ].x, HitPoly.Position[ 0 ].y, HitPoly.Position[ 0 ].z ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), " %f %f %f",
HitPoly.Position[ 1 ].x, HitPoly.Position[ 1 ].y, HitPoly.Position[ 1 ].z ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), " %f %f %f",
HitPoly.Position[ 2 ].x, HitPoly.Position[ 2 ].y, HitPoly.Position[ 2 ].z ) ;
// 当たったポリゴンの法線を描画
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Normal %f %f %f",
HitPoly.Normal.x, HitPoly.Normal.y, HitPoly.Normal.z ) ;
}
else
{
// 当たらなかった場合は衝突しなかった旨だけ描画する
DrawString( 0, 0, "NO HIT", GetColor( 255,255,255 ) ) ;
}
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル カメラの消失点を画面右側に変更してから立方体を描画します。
#include "DxLib.h"
#define X1 100.0f
#define X2 540.0f
#define Y1 100.0f
#define Y2 380.0f
#define Z1 0.0f
#define Z2 1000.0f
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int Color ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの注視点の画面上の位置を右寄りにする
SetCameraScreenCenter( 480.0f, 240.0f ) ;
// 直方体を描画する
Color = GetColor( 255,255,255 ) ;
DrawLine3D( VGet( X1, Y1, Z1 ), VGet( X2, Y1, Z1 ), Color ) ;
DrawLine3D( VGet( X2, Y1, Z1 ), VGet( X2, Y2, Z1 ), Color ) ;
DrawLine3D( VGet( X2, Y2, Z1 ), VGet( X1, Y2, Z1 ), Color ) ;
DrawLine3D( VGet( X1, Y2, Z1 ), VGet( X1, Y1, Z1 ), Color ) ;
DrawLine3D( VGet( X1, Y1, Z2 ), VGet( X2, Y1, Z2 ), Color ) ;
DrawLine3D( VGet( X2, Y1, Z2 ), VGet( X2, Y2, Z2 ), Color ) ;
DrawLine3D( VGet( X2, Y2, Z2 ), VGet( X1, Y2, Z2 ), Color ) ;
DrawLine3D( VGet( X1, Y2, Z2 ), VGet( X1, Y1, Z2 ), Color ) ;
DrawLine3D( VGet( X1, Y1, Z1 ), VGet( X1, Y1, Z2 ), Color ) ;
DrawLine3D( VGet( X2, Y1, Z1 ), VGet( X2, Y1, Z2 ), Color ) ;
DrawLine3D( VGet( X2, Y2, Z1 ), VGet( X2, Y2, Z2 ), Color ) ;
DrawLine3D( VGet( X1, Y2, Z1 ), VGet( X1, Y2, Z2 ), Color ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間内を左右に飛び回る点がカメラに入っているかどうかを画面左上に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Position ;
float XAdd ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 飛び回る点の座標を初期化
Position = VGet( 320, 240, 0.0f ) ;
// 飛び回る点のX軸の移動速度をセット
XAdd = 8.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// 点の座標を更新
Position.x += XAdd ;
// もし画面内から大きく外れたら方向を反転する
if( Position.x < -100.0f || Position.x > 740.0f )
{
XAdd = -XAdd ;
}
// 画面内に座標が入っていないかどうかを描画する
if( CheckCameraViewClip( Position ) == TRUE )
{
DrawString( 0, 0, "Screen Out:Yes", GetColor( 255,255,255 ) ) ;
}
else
{
DrawString( 0, 0, "Screen Out:No", GetColor( 255,255,255 ) ) ;
}
// 点を描画する
DrawPixel3D( Position, GetColor( 255,255,255 ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3D空間内を左右に飛び回るボックスがカメラに入っているかどうかを画面左上に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Position ;
VECTOR BoxPos1, BoxPos2 ;
float XAdd ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// Zバッファを使用する
SetUseZBuffer3D( TRUE ) ;
// Zバッファへの書き込みを行う
SetWriteZBuffer3D( TRUE ) ;
// 飛び回るボックスの座標を初期化
Position = VGet( 320, 240, 0.0f ) ;
// 飛び回るボックスのX軸の移動速度をセット
XAdd = 8.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// ボックスの座標を更新
Position.x += XAdd ;
// もし画面内から大きく外れたら方向を反転する
if( Position.x < -200.0f || Position.x > 840.0f )
{
XAdd = -XAdd ;
}
// ボックスを現す2点の座標を準備
BoxPos1 = VSub( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ;
BoxPos2 = VAdd( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ;
// 画面内にボックスが入っていないかどうかを描画する
if( CheckCameraViewClip_Box( BoxPos1, BoxPos2 ) == TRUE )
{
DrawString( 0, 0, "Screen Out:Yes", GetColor( 255,255,255 ) ) ;
}
else
{
DrawString( 0, 0, "Screen Out:No", GetColor( 255,255,255 ) ) ;
}
// ボックスを描画する
DrawCube3D( BoxPos1, BoxPos2, GetColor( 255,255,255 ), GetColor( 0,0,0 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ライト関数 | ||||||||||||||
| ||||||||||||||
|
サンプル DxChara.x をライティング計算をOFFにして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ライティングの計算をしないように設定を変更
SetUseLighting( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル グローバルアンビエントカラーを赤にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// グローバルアンビエントカラーを赤色に変更
SetGlobalAmbientLight( GetColorF( 1.0f, 0.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| 標準ライト関数 | ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトの方向をX軸のマイナス方向にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// X軸のマイナス方向のディレクショナルライトに変更
ChangeLightTypeDir( VGet( -1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトをポイントライトにして、D〜H、C〜Nまでのキーを使用して 各パラメータを変更できるようにしたサンプルです。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float Range, Atten0, Atten1, Atten2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 各パラメータを初期化
Range = 2000.0f ;
Atten0 = 0.0f ;
Atten1 = 0.0006f ;
Atten2 = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// DCキーでライトの影響範囲を変更
if( CheckHitKey( KEY_INPUT_D ) == 1 )
{
Range += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 )
{
Range -= 20.0f ;
}
// FVキーでライトの距離減衰パラメータ0の値を変更
if( CheckHitKey( KEY_INPUT_F ) == 1 )
{
Atten0 += 0.001f ;
}
if( CheckHitKey( KEY_INPUT_V ) == 1 )
{
Atten0 -= 0.001f ;
}
// GBキーでライトの距離減衰パラメータ1の値を変更
if( CheckHitKey( KEY_INPUT_G ) == 1 )
{
Atten1 += 0.00001f ;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 )
{
Atten1 -= 0.00001f ;
}
// HNキーでライトの距離減衰パラメータ2の値を変更
if( CheckHitKey( KEY_INPUT_H ) == 1 )
{
Atten2 += 0.0000001f ;
}
if( CheckHitKey( KEY_INPUT_N ) == 1 )
{
Atten2 -= 0.0000001f ;
}
// 影響距離の値を補正
if( Range < 0.0f ) Range = 0.0f ;
// 距離減衰パラメータの値を補正
if( Atten0 < 0.0f ) Atten0 = 0.0f ;
if( Atten1 < 0.0f ) Atten1 = 0.0f ;
if( Atten2 < 0.0f ) Atten2 = 0.0f ;
// モデルの上空にポイントライトを設定
ChangeLightTypePoint(
VGet( 320.0f, 1000.0f, 200.0f ),
Range,
Atten0,
Atten1,
Atten2 ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 200.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// パラメータの内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Key:D.C Range %f", Range ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Key:F.V Atten0 %f", Atten0 ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Key:G.B Atten1 %f", Atten1 ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Key:H.N Atten2 %f / 100.0f", Atten2 * 100.0f ) ;
// 裏画面の内容を表画面に反映する
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトをスポットライトにして、A〜H、Z〜Nまでのキーを使用して 各パラメータを変更できるようにしたサンプルです。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float OutAngle, InAngle, Range, Atten0, Atten1, Atten2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 各パラメータを初期化
OutAngle = 90.0f ;
InAngle = 45.0f ;
Range = 2000.0f ;
Atten0 = 0.0f ;
Atten1 = 0.0006f ;
Atten2 = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// AZキーで OutAngle の値を変更
if( CheckHitKey( KEY_INPUT_A ) == 1 )
{
OutAngle += 1.0f ;
}
if( CheckHitKey( KEY_INPUT_Z ) == 1 )
{
OutAngle -= 1.0f ;
}
// SXキーで InAngle の値を変更
if( CheckHitKey( KEY_INPUT_S ) == 1 )
{
InAngle += 1.0f ;
}
if( CheckHitKey( KEY_INPUT_X ) == 1 )
{
InAngle -= 1.0f ;
}
// DCキーでライトの影響範囲を変更
if( CheckHitKey( KEY_INPUT_D ) == 1 )
{
Range += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 )
{
Range -= 20.0f ;
}
// FVキーでライトの距離減衰パラメータ0の値を変更
if( CheckHitKey( KEY_INPUT_F ) == 1 )
{
Atten0 += 0.001f ;
}
if( CheckHitKey( KEY_INPUT_V ) == 1 )
{
Atten0 -= 0.001f ;
}
// GBキーでライトの距離減衰パラメータ1の値を変更
if( CheckHitKey( KEY_INPUT_G ) == 1 )
{
Atten1 += 0.00001f ;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 )
{
Atten1 -= 0.00001f ;
}
// HNキーでライトの距離減衰パラメータ2の値を変更
if( CheckHitKey( KEY_INPUT_H ) == 1 )
{
Atten2 += 0.0000001f ;
}
if( CheckHitKey( KEY_INPUT_N ) == 1 )
{
Atten2 -= 0.0000001f ;
}
// 角度の値を補正
if( OutAngle < 0.0f ) OutAngle = 0.0f ;
if( OutAngle > 180.0f ) OutAngle = 180.0f ;
if( InAngle < 0.0f ) InAngle = 0.0f ;
if( InAngle > OutAngle ) InAngle = OutAngle ;
// 影響距離の値を補正
if( Range < 0.0f ) Range = 0.0f ;
// 距離減衰パラメータの値を補正
if( Atten0 < 0.0f ) Atten0 = 0.0f ;
if( Atten1 < 0.0f ) Atten1 = 0.0f ;
if( Atten2 < 0.0f ) Atten2 = 0.0f ;
// Y軸のマイナス方向のスポットライトを設定
ChangeLightTypeSpot(
VGet( 320.0f, 1000.0f, 200.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
OutAngle * DX_PI_F / 180.0f,
InAngle * DX_PI_F / 180.0f,
Range,
Atten0,
Atten1,
Atten2 ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 200.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// パラメータの内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Key:A.Z OutAngle( 度 ) %f", OutAngle ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Key:S.X InAngle( 度 ) %f", InAngle ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Key:D.C Range %f", Range ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Key:F.V Atten0 %f", Atten0 ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Key:G.B Atten1 %f", Atten1 ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Key:H.N Atten2 %f / 100.0f", Atten2 * 100.0f ) ;
// 裏画面の内容を表画面に反映する
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル SimpleModel.mqo を普通に描画した後、標準ライトを無効にした状態で画面右側に描画します。 標準ライトのディレクショナルライトは当たらず、自己発光色の灰色のみになっているのが確認できます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 0.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// 標準ライトを無効にする
SetLightEnable( FALSE ) ;
// モデルの位置を変更
MV1SetPosition( ModelHandle, VGet( 700.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトのディフューズカラーを青色にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトのディフューズカラーを青色にする
SetLightDifColor( GetColorF( 0.0f, 0.0f, 1.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトのスペキュラカラーを黄色にした状態で SimpleModel.mqo を描画します。 ( スペキュラカラーの変化が変わりやすいようにディフューズカラーの色を黒にしています )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// スペキュラカラーの変化がわかりやすいように標準ライトのディフューズカラーを真っ黒にする
SetLightDifColor( GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 標準ライトのスペキュラカラーを黄色にする
SetLightSpcColor( GetColorF( 1.0f, 1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトのアンビエントカラーを暗い緑色にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトのアンビエントカラーを暗い緑色にする
SetLightAmbColor( GetColorF( 0.0f, 0.2f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトの向きをX軸のプラス方向にした状態で SimpleModel.mqo を描画します。 ( 標準ライトの初期タイプはディレクショナルライトです )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトの方向をX軸のプラス方向にする
SetLightDirection( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトをポイントライトに変更した後、ライトの位置をモデルの上側に移動した状態で モデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// 標準ライトをポイントライトにする
ChangeLightTypePoint( VGet( 0.0f, 0.0f, 0.0f ), 2000.0f, 0.0f, 0.002f, 0.0f ) ;
// 標準ライトの位置をモデルの上に移動する
SetLightPosition( VGet( 320.0f, 1000.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル 標準ライトの情報を画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
char *TypeName ;
COLOR_F Color ;
VECTOR Vector ;
float Range, Atten0, Atten1, Atten2 ;
float InAngle, OutAngle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 画面に標準ライトのタイプを描画
switch( GetLightType() )
{
case DX_LIGHTTYPE_DIRECTIONAL : TypeName = "Directional" ; break ;
case DX_LIGHTTYPE_POINT : TypeName = "Point" ; break ;
case DX_LIGHTTYPE_SPOT : TypeName = "Spot" ; break ;
}
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LightType %s", TypeName ) ;
// ライトが有効かどうかを描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Enable %d", GetLightEnable() ) ;
// ディフューズカラーを描画
Color = GetLightDifColor() ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Diffuse Color %f %f %f", Color.r, Color.g, Color.b ) ;
// スペキュラカラーを描画
Color = GetLightSpcColor() ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Specular Color %f %f %f", Color.r, Color.g, Color.b ) ;
// アンビエントカラーを描画
Color = GetLightAmbColor() ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color %f %f %f", Color.r, Color.g, Color.b ) ;
// 向きを描画
Vector = GetLightDirection() ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Direction %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 位置を描画
Vector = GetLightPosition() ;
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Position %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 有効距離と距離減衰パラメータを描画する
GetLightRangeAtten( &Range, &Atten0, &Atten1, &Atten2 ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Range %f", Range ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Attenuation0 %f", Atten0 ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "Attenuation1 %f", Atten1 ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "Attenuation2 %f", Atten2 ) ;
// 照射角度パラメータを描画する
GetLightAngle( &OutAngle, &InAngle ) ;
DrawFormatString( 0, 176, GetColor( 255,255,255 ), "In Angle %f", InAngle ) ;
DrawFormatString( 0, 192, GetColor( 255,255,255 ), "Out Angle %f", OutAngle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightType関数 のサンプルを参照してください。 | ||||||||||||||
| ライトハンドル関数 | ||||||||||||||
| ||||||||||||||
|
サンプル X軸にマイナス方向のディレクショナルライトハンドルを作成して、 効果がわかり易いように標準ライトを無効にした上でモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// X軸にマイナス方向のディレクショナルタイプのライトの作成
LightHandle = CreateDirLightHandle( VGet( -1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 読み込んだモデルの上側にポイントライトを作成して、 効果がわかり易いように標準ライトを無効にした上でモデルを描画します。 ポイントライトの各パラメータを変化させるとどのような変化があるのかは ChangeLightTypePoint関数 のサンプルで確認できます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルの上側にポイントタイプのライトを作成
LightHandle = CreatePointLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 読み込んだモデルの上側に下向きの光を放つスポットライトを作成して、 効果がわかり易いように標準ライトを無効にした上でモデルを描画します。 スポットライトの各パラメータを変化させるとどのような変化があるのかは ChangeLightTypeSpot関数 のサンプルで確認できます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルの上側に下向きのスポットタイプのライトを作成
LightHandle = CreateSpotLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
DX_PI_F / 2.0f,
DX_PI_F / 4.0f,
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ディレクショナルライトを作成してすぐ削除します。 削除関数を使うサンプルプログラムなので実行しても何も起きません。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// ディレクショナルライトタイプのハンドルの作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// 直後に削除
DeleteLightHandle( LightHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ディレクショナルタイプのライトを作成した後、それをポイントタイプのライトに変更して ポイントライトとしてのパラメータを設定した後モデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルの作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// ライトのタイプをポイントライトに変更
SetLightTypeHandle( LightHandle, DX_LIGHTTYPE_POINT ) ;
// 位置を設定
SetLightPositionHandle( LightHandle, VGet( 320.0f, 1000.0f, 600.0f ) ) ;
// 有効距離と距離減衰パラメータを設定
SetLightRangeAttenHandle( LightHandle, 2000.0f, 0.0f, 0.002f, 0.0f ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 3つのディレクショナルタイプのライトハンドルを作成した後、各ライトを50%の確率で 無効にして、そのあとモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle[ 3 ], ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを3つ作成
LightHandle[ 0 ] = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
LightHandle[ 1 ] = CreateDirLightHandle( VGet( 0.0f, 1.0f, 0.0f ) ) ;
LightHandle[ 2 ] = CreateDirLightHandle( VGet( 0.0f, 0.0f, 1.0f ) ) ;
// 各ライトを50%の確率で無効にする
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 0 ], FALSE ) ;
}
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 1 ], FALSE ) ;
}
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 2 ], FALSE ) ;
}
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ライトハンドルのディフューズカラーを青色にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルのディフューズカラーを青色にする
SetLightDifColorHandle( LightHandle, GetColorF( 0.0f, 0.0f, 1.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ライトハンドルのスペキュラカラーを赤色にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// スペキュラカラーの変更がわかり易いようにディフューズカラーを黒にする
SetLightDifColorHandle( LightHandle, GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// ライトハンドルのスペキュラカラーを赤色にする
SetLightSpcColorHandle( LightHandle, GetColorF( 1.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ライトハンドルのアンビエントカラーを暗い緑色にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルのアンビエントカラーを暗い緑色にする
SetLightAmbColorHandle( LightHandle, GetColorF( 0.0f, 0.2f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ライトハンドルのライトの向きをX軸のプラス方向にした状態で SimpleModel.mqo を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルの方向をX軸のプラス方向にする
SetLightDirectionHandle( LightHandle, VGet( 1.0f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ポイントタイプのライトを作成した後、ライトの位置をモデルの上側に移動してから モデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ポイントタイプのライトハンドルを作成
LightHandle = CreatePointLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// ライトハンドルの位置をモデルの上側に移動
SetLightPositionHandle( LightHandle, VGet( 320.0f, 1000.0f, 600.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル スポットライトを作成して、そのライトの情報を画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
char *TypeName ;
COLOR_F Color ;
VECTOR Vector ;
float Range, Atten0, Atten1, Atten2 ;
float InAngle, OutAngle ;
int LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// スポットタイプのライトの作成
LightHandle = CreateSpotLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
DX_PI_F / 2.0f,
DX_PI_F / 4.0f,
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// 画面に標準ライトのタイプを描画
switch( GetLightTypeHandle( LightHandle ) )
{
case DX_LIGHTTYPE_DIRECTIONAL : TypeName = "Directional" ; break ;
case DX_LIGHTTYPE_POINT : TypeName = "Point" ; break ;
case DX_LIGHTTYPE_SPOT : TypeName = "Spot" ; break ;
}
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LightType %s", TypeName ) ;
// ライトが有効かどうかを描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Enable %d", GetLightEnableHandle( LightHandle ) ) ;
// ディフューズカラーを描画
Color = GetLightDifColorHandle( LightHandle ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Diffuse Color %f %f %f", Color.r, Color.g, Color.b ) ;
// スペキュラカラーを描画
Color = GetLightSpcColorHandle( LightHandle ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Specular Color %f %f %f", Color.r, Color.g, Color.b ) ;
// アンビエントカラーを描画
Color = GetLightAmbColorHandle( LightHandle ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color %f %f %f", Color.r, Color.g, Color.b ) ;
// 向きを描画
Vector = GetLightDirectionHandle( LightHandle ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Direction %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 位置を描画
Vector = GetLightPositionHandle( LightHandle ) ;
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Position %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 有効距離と距離減衰パラメータを描画する
GetLightRangeAttenHandle( LightHandle, &Range, &Atten0, &Atten1, &Atten2 ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Range %f", Range ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Attenuation0 %f", Atten0 ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "Attenuation1 %f", Atten1 ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "Attenuation2 %f", Atten2 ) ;
// 照射角度パラメータを描画する
GetLightAngleHandle( LightHandle, &OutAngle, &InAngle ) ;
DrawFormatString( 0, 176, GetColor( 255,255,255 ), "In Angle %f", InAngle ) ;
DrawFormatString( 0, 192, GetColor( 255,255,255 ), "Out Angle %f", OutAngle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル GetLightTypeHandle関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません。 | ||||||||||||||
| 算術演算関数 | ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect に値を代入します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値( x=100.0f y=200.0f z=400.0f )を代入
Vect = VGet( 100.0f, 200.0f, 400.0f ) ;
// Vect の内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect1 と Vect2 を加算して、結果を Vect1 に代入します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect1 と Vect2 に値を代入
Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ;
Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ;
// Vect1 と Vect2 を加算して結果を Vect1 に代入
Vect1 = VAdd( Vect1, Vect2 ) ;
// Vect1 の内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect1 から Vect2 を減算して、結果を Vect1 に代入します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect1 と Vect2 に値を代入
Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ;
Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ;
// Vect1 から Vect2 を減算して結果を Vect1 に代入
Vect1 = VSub( Vect1, Vect2 ) ;
// Vect1 の内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect1 と Vect2 の内積を画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect1 と Vect2 に値を代入
Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ;
Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ;
// Vect1 と Vect2 の内積を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Dot %f", VDot( Vect1, Vect2 ) ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect1 と Vect2 の外積を画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect1 と Vect2 に値を代入
Vect1 = VGet( 100.0f, 200.0f, 500.0f ) ;
Vect2 = VGet( 30.0f, 100.0f, 80.0f ) ;
// Vect1 と Vect2 の外戚を Vect1 に代入
Vect1 = VCross( Vect1, Vect2 ) ;
// Vect1 の内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect1 x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect の内容を 8.0f 倍して、その結果を画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// Vect を 8.0f 倍して、その結果を Vect に代入
Vect = VScale( Vect, 8.0f ) ;
// Vect の内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect のサイズを画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// Vect のサイズを画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Size %f", VSize( Vect ) ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect のサイズの二乗を画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// Vect のサイズの二乗を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Size %f", VSquareSize( Vect ) ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect を正規化した値を画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// Vect の値を正規化して、その結果を Vect に代入する
Vect = VNorm( Vect ) ;
// Vect の値を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect をスケーリング行列を使用して 0.5f 倍します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
MATRIX Matrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// 0.5倍スケーリングを行う行列を作成
Matrix = MGetScale( VGet( 0.5f, 0.5f, 0.5f ) ) ;
// 0.5倍スケーリングを行う行列を使用してベクトルのサイズを0.5倍した結果を Vect に代入する
Vect = VTransform( Vect, Matrix ) ;
// Vect の値を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル VECTOR 構造体 Vect をスケーリング行列を使用して 0.5f 倍します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VECTOR Vect ;
MATRIX Matrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Vect に値を代入
Vect = VGet( 100.0f, 200.0f, 500.0f ) ;
// 0.5倍スケーリングを行う行列を作成
Matrix = MGetScale( VGet( 0.5f, 0.5f, 0.5f ) ) ;
// 0.5倍スケーリングを行う行列を使用してベクトルのサイズを0.5倍した結果を Vect に代入する
Vect = VTransformSR( Vect, Matrix ) ;
// Vect の値を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Vect x=%f y=%f z=%f", Vect.x, Vect.y, Vect.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 単位行列を取得して画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 単位行列を Matrix に代入
Matrix = MGetIdent() ;
// Matrix の値を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 拡大行列を取得してベクトルの拡大変換を行います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// 拡大行列を Matrix に代入
Matrix = MGetScale( VGet( 2.0f, 5.0f, 8.0f ) ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "拡大行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 平行移動行列を使用してベクトルの平行移動変換を行います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// 平行移動行列を Matrix に代入
Matrix = MGetTranslate( VGet( 100.0f, 80.0f, 85.0f ) ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "平行移動行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル X軸回転行列を使用してベクトルのX軸回転を行います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// X軸回転行列を Matrix に代入( 45度回転する行列 )
Matrix = MGetRotX( DX_PI_F / 4.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "X軸回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル Y軸回転行列を使用してベクトルのY軸回転を行います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// Y軸回転行列を Matrix に代入( 45度回転する行列 )
Matrix = MGetRotY( DX_PI_F / 4.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "Y軸回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル Z軸回転行列を使用してベクトルのZ軸回転を行います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// Z軸回転行列を Matrix に代入( 45度回転する行列 )
Matrix = MGetRotZ( DX_PI_F / 4.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "Z軸回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MGetRotAxis 関数を使用して敢えてY軸回転行列を作成します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 8.0f, 56.0f ) ;
// MGetRotAxis を使用して敢えてY軸回転行列を Matrix に代入( 45度回転する行列 )
Matrix = MGetRotAxis( VGet( 0.0f, 1.0f, 0.0f ), DX_PI_F / 4.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "Y軸回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル X軸のプラスの方向をY軸のマイナスの方向に回転する行列を取得する。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// X軸のプラスの方向をY軸のマイナスの方向に回転する行列を取得する
Matrix = MGetRotVec2( VGet( 1.0f, 0.0f, 0.0f ), VGet( 0.0f, -1.0f, 0.0f ) ) ;
// X軸に対してプラスの値を Vect1 に代入
Vect1 = VGet( 80.0f, 0.0f, 0.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 基本軸上のYのプラス値をX軸 基本軸上のZのプラス値をY軸 基本軸上のXのマイナス値をZ軸とし、 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする 3軸上のベクトルを基本軸上のベクトルに変換する行列を取得する
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 基本軸上のYのプラス値をX軸
// 基本軸上のZのプラス値をY軸
// 基本軸上のXのマイナス値をZ軸とし、
// 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする
// 3軸上のベクトルを基本軸上のベクトルに変換する行列の取得
Matrix = MGetAxis1(
VGet( 0.0f, 1.0f, 0.0f ),
VGet( 0.0f, 0.0f, 1.0f ),
VGet( -1.0f, 0.0f, 0.0f ),
VGet( 100.0f, 0.0f, 200.0f ) ) ;
// 上記軸上のX軸とY軸に対してプラスのベクトル Vect1 に代入
Vect1 = VGet( 80.0f, 50.0f, 0.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "変換行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 基本軸上のベクトルを 基本軸上のYのプラス値をX軸 基本軸上のZのプラス値をY軸 基本軸上のXのマイナス値をZ軸とし、 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする 3軸上のベクトルに変換する行列を取得する
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 基本軸上のベクトルを
// 基本軸上のYのプラス値をX軸
// 基本軸上のZのプラス値をY軸
// 基本軸上のXのマイナス値をZ軸とし、
// 且つ基本軸上の x=100.0f y=0.0f z=200.0f を原点とする
// 3軸上のベクトルに変換する行列の取得
Matrix = MGetAxis2(
VGet( 0.0f, 1.0f, 0.0f ),
VGet( 0.0f, 0.0f, 1.0f ),
VGet( -1.0f, 0.0f, 0.0f ),
VGet( 100.0f, 0.0f, 200.0f ) ) ;
// 任意の3軸上の原点に位置する基本軸上のベクトルを Vect に代入
Vect1 = VGet( 100.0f, 0.0f, 200.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix の値を画面に表示
DrawString( 0, 0, "変換行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 96, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 144, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ベクトルを0.8倍する行列と0.2倍する行列を足して、その行列を使用して ベクトルを変換します、0.8倍と0.2倍を足すと1.0倍なので、ベクトルは 変換前と同じ値になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix, Matrix1, Matrix2 ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 0.8倍に拡大する行列と0.2倍に拡大する行列を Matrix1 と Matrix2 に代入
Matrix1 = MGetScale( VGet( 0.8f, 0.8f, 0.8f ) ) ;
Matrix2 = MGetScale( VGet( 0.2f, 0.2f, 0.2f ) ) ;
// 二つの行列を足したものを Matrix に代入
Matrix = MAdd( Matrix1, Matrix2 ) ;
// 適当な値を Vect1 に代入
Vect1 = VGet( 100.0f, 0.0f, 200.0f ) ;
// Vect1 を Matrix3 を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix1 の値を画面に表示
DrawString( 0, 0, "0.8倍行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ;
// Matrix2 の値を画面に表示
DrawString( 0, 96, "0.2倍行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ;
// Matrix の値を画面に表示
DrawString( 0, 192, "加算後の行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ベクトルをY軸回転90度する行列とY軸回転−90度する2倍に拡大する行列を乗算して ベクトルに対してY軸回転行列→2倍拡大行列の順で VTransform を使用した場合と同じ効果がある行列を作成します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix, Matrix1, Matrix2 ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Y軸回転90度する行列とY軸回転−90度する行列を作成
Matrix1 = MGetRotY( DX_PI_F / 2.0f ) ;
Matrix2 = MGetRotY( -DX_PI_F / 2.0f ) ;
// 二つの行列を0.5倍して加算したものを Matrix に代入
Matrix = MAdd( MScale( Matrix1, 0.5f ), MScale( Matrix2, 0.5f ) ) ;
// 適当な値を Vect1 に代入
Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ;
// Vect1 を Matrix3 を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix1 の値を画面に表示
DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ;
// Matrix2 の値を画面に表示
DrawString( 0, 96, "Y軸−90度回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ;
// Matrix の値を画面に表示
DrawString( 0, 192, "乗算後の行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ベクトルをY軸回転90度する行列とX軸回転90度する行列をそれぞれ0.5倍して 加算したものを作ります。 この行列はY軸回転90度する行列を使用して VTransform したベクトルと X軸回転90度する行列を使用して VTransform したベクトルをそれぞれ0.5倍して 加算したものと同じ結果が出力される行列となります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix, Matrix1, Matrix2 ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Y軸回転90度する行列とX軸回転90度する行列を作成
Matrix1 = MGetRotY( DX_PI_F / 2.0f ) ;
Matrix2 = MGetRotX( DX_PI_F / 2.0f ) ;
// 二つの行列を0.5倍して加算したものを Matrix に代入
Matrix = MAdd( MScale( Matrix1, 0.5f ), MScale( Matrix2, 0.5f ) ) ;
// 適当な値を Vect1 に代入
Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ;
// Vect1 を Matrix3 を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix1 の値を画面に表示
DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix1.m[0][0], Matrix1.m[0][1], Matrix1.m[0][2], Matrix1.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix1.m[1][0], Matrix1.m[1][1], Matrix1.m[1][2], Matrix1.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix1.m[2][0], Matrix1.m[2][1], Matrix1.m[2][2], Matrix1.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix1.m[3][0], Matrix1.m[3][1], Matrix1.m[3][2], Matrix1.m[3][3] ) ;
// Matrix2 の値を画面に表示
DrawString( 0, 96, "X軸90度回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ;
// Matrix の値を画面に表示
DrawString( 0, 192, "乗算後の行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ベクトルをY軸回転90度する行列を転置した行列を使用してベクトルを回転します。 回転行列を転置した行列は逆回転( Y軸回転−90度 )する行列となります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix, Matrix2 ;
VECTOR Vect1, Vect2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// Y軸回転90度する行列を Matrix2 に代入
Matrix2 = MGetRotY( DX_PI_F / 2.0f ) ;
// Matrix2 を転置した行列を Matrix に代入
Matrix = MTranspose( Matrix2 ) ;
// 適当な値を Vect1 に代入
Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
// Matrix2 の値を画面に表示
DrawString( 0, 0, "Y軸90度回転行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ;
// Matrix の値を画面に表示
DrawString( 0, 192, "転置行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 336, "変換後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 平行移動する行列とその逆行列を用意して、適当な値を持ったベクトルが 平行移動行列→その逆行列 の順で VTransform すれば元の値に戻るかを試します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MATRIX Matrix, Matrix2 ;
VECTOR Vect1, Vect2, Vect3 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 平行移動する行列を Matrix2 に代入
Matrix2 = MGetTranslate( VGet( 200.0f, 100.0f, 80.0f ) ) ;
// Matrix2 の逆行列を Matrix に代入
Matrix = MInverse( Matrix2 ) ;
// 適当な値を Vect1 に代入
Vect1 = VGet( 200.0f, 0.0f, 0.0f ) ;
// Vect1 を Matrix2 を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix2 ) ;
// Vect2 を Matrix2 の逆行列である Matrix で変換したものを Vect3 に代入
Vect3 = VTransform( Vect2, Matrix ) ;
// Matrix2 の値を画面に表示
DrawString( 0, 0, "平行移動行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix2.m[0][0], Matrix2.m[0][1], Matrix2.m[0][2], Matrix2.m[0][3] ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix2.m[1][0], Matrix2.m[1][1], Matrix2.m[1][2], Matrix2.m[1][3] ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix2.m[2][0], Matrix2.m[2][1], Matrix2.m[2][2], Matrix2.m[2][3] ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix2.m[3][0], Matrix2.m[3][1], Matrix2.m[3][2], Matrix2.m[3][3] ) ;
// Matrix の値を画面に表示
DrawString( 0, 192, "逆行列", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "m00 %f m01 %f m02 %f m03 %f",
Matrix.m[0][0], Matrix.m[0][1], Matrix.m[0][2], Matrix.m[0][3] ) ;
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "m10 %f m11 %f m12 %f m13 %f",
Matrix.m[1][0], Matrix.m[1][1], Matrix.m[1][2], Matrix.m[1][3] ) ;
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "m20 %f m21 %f m22 %f m23 %f",
Matrix.m[2][0], Matrix.m[2][1], Matrix.m[2][2], Matrix.m[2][3] ) ;
DrawFormatString( 0, 256, GetColor( 255,255,255 ), "m30 %f m31 %f m32 %f m33 %f",
Matrix.m[3][0], Matrix.m[3][1], Matrix.m[3][2], Matrix.m[3][3] ) ;
// 変換元のベクトル値 Vect1 を画面に表示
DrawString( 0, 288, "変換前のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 304, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect1.x, Vect1.y, Vect1.z ) ;
// 変換後のベクトル値 Vect2 を画面に表示
DrawString( 0, 336, "平行移動後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 352, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect2.x, Vect2.y, Vect2.z ) ;
// 変換後のベクトル値 Vect3 を画面に表示
DrawString( 0, 384, "逆行列乗算後のベクトル", GetColor( 255,255,255 ) ) ;
DrawFormatString( 0, 400, GetColor( 255,255,255 ), "x=%f y=%f z=%f", Vect3.x, Vect3.y, Vect3.z ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| 衝突検出系関数 | ||||||||||||||
| ||||||||||||||
|
サンプル 線分を二つ定義して、片方の線分の終点を左右動かし、二線分の最近点間の距離が 64 以下になった際に 線分の色を赤色にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
float xadd, length ;
VECTOR LineA1, LineA2, LineB1, LineB2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 二線分の座標をセット
LineA1 = VGet( 0.0f, 0.0f, 0.0f ) ;
LineA2 = VGet( 0.0f, 200.0f, 0.0f ) ;
LineB1 = VGet( 320.0f, 480.0f, 0.0f ) ;
LineB2 = VGet( 320.0f, 240.0f, 0.0f ) ;
// 座標と加算数の初期化
xadd = 8.0f ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 線分の片方の終点を移動
LineA2.x += xadd ;
if( LineA2.x < 0.0f || LineA2.x > 640.0f )
xadd = -xadd ;
// 二線分の最近点どうしの距離を求める
length = Segment_Segment_MinLength( LineA1, LineA2, LineB1, LineB2 ) ;
// 片方の線分の描画
DrawLine( LineB1.x, LineB1.y, LineB2.x, LineB2.y, GetColor( 255,255,255 ) ) ;
// もう一つの線分を距離が 64 以下だったら色を変えて描画
if( length < 64.0f )
{
DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 255,0,0 ) ) ;
}
else
{
DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 0,255,0 ) ) ;
}
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 線分と三角形の座標を定義して、線分の終点を左右動かし、線分と三角形の最近点間の距離が 64 以下になった際に 三角形の色を赤色にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
float xadd, length ;
VECTOR Line1, Line2, Tri1, Tri2, Tri3 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 線分の座標と三角形を形成する3頂点の座標をセット
Line1 = VGet( 0.0f, 0.0f, 0.0f ) ;
Line2 = VGet( 0.0f, 400.0f, 0.0f ) ;
Tri1 = VGet( 320.0f, 200.0f, 0.0f ) ;
Tri2 = VGet( 280.0f, 260.0f, 0.0f ) ;
Tri3 = VGet( 360.0f, 260.0f, 0.0f ) ;
// 座標と加算数の初期化
xadd = 8.0f ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 線分の終点を移動
Line2.x += xadd ;
if( Line2.x < 0.0f || Line2.x > 640.0f )
xadd = -xadd ;
// 線分と三角形の最近点間の距離を求める
length = Segment_Triangle_MinLength( Line1, Line2, Tri1, Tri2, Tri3 ) ;
// 線分の描画
DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 255,255,255 ) ) ;
// 三角形との距離が 64 以下だったら色を変えて描画
if( length < 64.0f )
{
DrawTriangle( Tri1.x, Tri1.y, Tri2.x, Tri2.y, Tri3.x, Tri3.y, GetColor( 255,0,0 ), TRUE ) ;
}
else
{
DrawTriangle( Tri1.x, Tri1.y, Tri2.x, Tri2.y, Tri3.x, Tri3.y, GetColor( 0,255,0 ), TRUE ) ;
}
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 線分と点の座標を定義して、点の座標を上下に動かし、線分と点の最近点間の距離が 64 以下になった際に 線分の色を赤色にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
float yadd, length ;
VECTOR Line1, Line2, Point ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 線分の座標と点の座標をセット
Line1 = VGet( 0.0f, 0.0f, 0.0f ) ;
Line2 = VGet( 640.0f, 480.0f, 0.0f ) ;
Point = VGet( 320.0f, 0.0f, 0.0f ) ;
// 座標と加算数の初期化
yadd = 4.0f ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 点の座標を移動
Point.y += yadd ;
if( Point.y < 0.0f || Point.y > 480.0f )
yadd = -yadd ;
// 線分と点が最も近づく座標間の距離を求める
length = Segment_Point_MinLength( Line1, Line2, Point ) ;
// 点の描画
DrawPixel( Point.x, Point.y, GetColor( 255,255,255 ) ) ;
// 点との距離が 64 以下だったら色を変えて描画
if( length < 64.0f )
{
DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 255,0,0 ) ) ;
}
else
{
DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 0,255,0 ) ) ;
}
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 線分と三角形の座標を定義して、線分の終点を上下に動かしながら線分と三角形の当たり判定を行い 三角形と接触した場合は線分の始点と接触点とを結ぶ線を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
float yadd ;
HITRESULT_LINE Result ;
VECTOR Line1, Line2, Tri1, Tri2, Tri3 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 線分の座標と三角形の座標をセット
Line1 = VGet( 0.0f, 240.0f, 0.0f ) ;
Line2 = VGet( 640.0f, 240.0f, 0.0f ) ;
Tri1 = VGet( 320.0f, 128.0f, 0.0f ) ;
Tri2 = VGet( 320.0f, 240.0f, 200.0f ) ;
Tri3 = VGet( 320.0f, 240.0f, -200.0f ) ;
// 座標と加算数の初期化
yadd = 4.0f ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 線の終点座標を移動
Line2.y += yadd ;
if( Line2.y < 0.0f || Line2.y > 480.0f )
yadd = -yadd ;
// 線分と点が最も近づく座標間の距離を求める
Result = HitCheck_Line_Triangle( Line1, Line2, Tri1, Tri2, Tri3 ) ;
// 三角形を真横から見たときにできる線を描画
DrawLine( Tri1.x, Tri1.y, Tri2.x, Tri2.y, GetColor( 255,255,255 ) ) ;
// 三角形と接触していたら始点と接触点を結ぶ線を
// そうでない場合は始点と終点を結ぶ線を描画する
if( Result.HitFlag == 1 )
{
DrawLine( Line1.x, Line1.y, Result.Position.x, Result.Position.y, GetColor( 255,0,0 ) ) ;
}
else
{
DrawLine( Line1.x, Line1.y, Line2.x, Line2.y, GetColor( 0,255,0 ) ) ;
}
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| モデルの読み込み・複製関係の関数 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んだあと、同じデータを使用するモデルハンドルを3つ作成し、 それぞれ座標をずらして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle[ 4 ] ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle[ 0 ] = MV1LoadModel( "DxChara.x" ) ;
// 同じデータを使用するモデルハンドルを3つ作成する
ModelHandle[ 1 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ;
ModelHandle[ 2 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ;
ModelHandle[ 3 ] = MV1DuplicateModel( ModelHandle[ 0 ] ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle[ 0 ], VGet( -200.0f, -300.0f, 600.0f ) ) ;
MV1SetPosition( ModelHandle[ 1 ], VGet( 150.0f, -300.0f, 600.0f ) ) ;
MV1SetPosition( ModelHandle[ 2 ], VGet( 500.0f, -300.0f, 600.0f ) ) ;
MV1SetPosition( ModelHandle[ 3 ], VGet( 850.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle[ 0 ] ) ;
MV1DrawModel( ModelHandle[ 1 ] ) ;
MV1DrawModel( ModelHandle[ 2 ] ) ;
MV1DrawModel( ModelHandle[ 3 ] ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル DxChara.x を MV1LoadModel で読み込んだ後、ひたすら MV1DuplicateModel でモデルを作成 → 描画 → MV1DeleteModel で削除を繰り返します。 ( サンプルでは MV1DeleteModel を使うために無意味に作成と削除を繰り返していますが、移動して描画する度に削除と作成をしなければいけないわけではありません )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, DupModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 何かボタンが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 読み込んだデータと同じデータを使用するモデルハンドルを作成する
DupModelHandle = MV1DuplicateModel( ModelHandle ) ;
// 画面に映るランダムな位置に3Dモデルを移動
MV1SetPosition( DupModelHandle, VGet( ( float )GetRand( 639 ), ( float )-GetRand( 300 ), GetRand( 300 ) + 300.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( DupModelHandle ) ;
// 3Dモデルの削除
MV1DeleteModel( DupModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル リアルタイム物理演算モードで Test.pmd と Test000.vmd を MV1LoadModel で読み込んで リアルタイム物理演算を行いながらアニメーション0をループ再生します。 尚、Test.pmd と Test000.vmd はDXライブラリのパッケージには含まれていませんので、別途用意してください。 PMDのキャラクターは大体同じ大きさですので、カメラの設定などはそのままで問題ないと思います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex ;
float TotalTime, PlayTime ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする
MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "Test.pmd" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラに映る範囲( カメラからの距離の範囲 )を設定
SetCameraNearFar( 10.0f, 1000.0f ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 物理演算の状態をリセット
MV1PhysicsResetState( ModelHandle ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
// 何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 再生時間を進める
PlayTime += 0.5f ;
// 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す
if( PlayTime >= TotalTime )
{
PlayTime = 0.0f ;
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
// モーションがループしたときに位置が移動することがあるので物理演算の状態をリセット
MV1PhysicsResetState( ModelHandle ) ;
}
else
{
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
}
// 物理演算を60分の1秒経過したという設定で実行
MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| モデル描画関係 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1LoadModel のサンプルを参考にして下さい。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、2番目のフレームのみ画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの2番目のフレームを描画
MV1DrawFrame( ModelHandle, 2 ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、0番目のメッシュを画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの0番目のメッシュを描画
MV1DrawMesh( ModelHandle, 0 ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| モデル描画設定関数 | ||||||||||||||
| ||||||||||||||
|
サンプル オリジナルシェーダーを利用した3Dモデルの描画サンプルや、デフォルトのシェーダー処理についての情報などは こちらをご参照ください。 | ||||||||||||||
| ||||||||||||||
|
サンプル 画面左側に通常の設定で半透明の3Dモデルと不透明の3Dモデルを描画、画面右側に解説にある 手順で同様に半透明の3Dモデルと不透明の3Dモデルを描画して結果を比較するサンプルです。
#include "DxLib.h"
#define CHARA_SPACE (300.0f)
#define CHARA_X (250.0f)
int CharaModelHandle ;
// キャラクターモデルの描画
void Chara_Draw( float x )
{
int i ;
// 手前から2体描画
for( i = 0 ; i < 2 ; i ++ )
{
// 先頭のキャラを半透明にする
MV1SetOpacityRate( CharaModelHandle, i == 0 ? 0.5f : 1.0f ) ;
// 座標を設定
MV1SetPosition( CharaModelHandle, VGet( x, 0.0f, i * CHARA_SPACE ) ) ;
// モデルを描画
MV1DrawModel( CharaModelHandle ) ;
}
}
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 400.0f, -700.0f ), VGet( 0.0f, 400.0f, 0.0f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 20.0f, 5000.0f );
// 背景の色を灰色に変更
SetBackgroundColor( 128,128,128 ) ;
// 画面をクリア
ClearDrawScreen() ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 通常の設定で画面左側にキャラクターを描画
MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_ALWAYS ) ;
Chara_Draw( -CHARA_X ) ;
// 画面右側に先に半透明要素の無い3Dモデルのみ描画する設定でキャラクターを描画した後、
// 半透明要素のある3Dモデルのみ描画する設定でキャラクターを描画する
MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY ) ;
Chara_Draw( CHARA_X ) ;
MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY ) ;
Chara_Draw( CHARA_X ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| モデル基本制御関係 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1LoadModel のサンプルを参考にして下さい。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、x軸方向に2倍に拡大して描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルのスケールをx軸方向に2倍にする
MV1SetScale( ModelHandle, VGet( 2.0f, 1.0f, 1.0f ) ) ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、y軸を回転軸として90度回転して描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3DモデルのY軸の回転値を90度にセットする
MV1SetRotationXYZ( ModelHandle, VGet( 0.0f, 90.0f * DX_PI_F / 180.0f, 0.0f ) ) ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、モデルのz軸の方向を画面左上の方に向けて描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 0.0f, 600.0f ) ) ;
// 3DモデルのZ軸を画面左上方向に向ける
// ( DxChara.x はZ軸のマイナス方向に向いているので右下方向に傾きます )
MV1SetRotationZYAxis( ModelHandle, VGet( -0.5f, 0.5f, 0.0f ), VGet( 0.5f, 0.5f, 0.0f ), 0.0f ) ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで、拡大率を2倍にしてから座標をカメラの写る位置に移動するということを行列を使用して設定した後に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 2倍に拡大した後画面に映る位置に3Dモデルを移動する行列のセット
MV1SetMatrix( ModelHandle, MMult( MGetScale( VGet( 2.0f, 2.0f, 2.0f ) ), MGetTranslate( VGet( 320.0f, -600.0f, 600.0f ) ) ) ) ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を読み込んで複製した後、最初に読み込んだモデルハンドルの方に座標位置変更や拡大率の設定を行い、 その結果の行列を複製したモデルに設定して描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, SubModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ModelHandle と同じモデルを使用するモデルの作成
SubModelHandle = MV1DuplicateModel( ModelHandle ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 0.0f, 600.0f ) ) ;
// 3Dモデルの拡大率を0.5倍にする
MV1SetScale( ModelHandle, VGet( 0.5f, 0.5f, 0.5f ) ) ;
// ModelHandle に設定した座標変換パラメータの結果の行列を SubModelHandle の座標変換行列として設定する
MV1SetMatrix( SubModelHandle, MV1GetMatrix( ModelHandle ) ) ;
// SubModelHandle の方の3Dモデルを描画
MV1DrawModel( SubModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x を GetNowCount が返す値が奇数秒の時だけ描画する。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 何かキーが押されるかウインドウが閉じられるまでループする
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリアする
ClearDrawScreen() ;
// 3Dモデルをカウンタが奇数秒の時は描画して、偶数表のときは描画しないようにする
if( GetNowCount() % 2000 < 1000 )
{
MV1SetVisible( ModelHandle, TRUE ) ;
}
else
{
MV1SetVisible( ModelHandle, FALSE ) ;
}
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x のディフューズカラーの緑成分と青成分を0%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルのディフューズカラーの緑成分と青成分を0%にする
MV1SetDifColorScale( ModelHandle, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x のスペキュラカラーの緑成分と青成分を0%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルのスペキュラカラーの緑成分と青成分を0%にする
MV1SetSpcColorScale( ModelHandle, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x のエミッシブカラーの緑成分と青成分を0%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルのエミッシブカラーの緑成分と青成分を0%にする
MV1SetEmiColorScale( ModelHandle, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x のアンビエントカラーの緑成分と青成分を0%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルのアンビエントカラーの緑成分と青成分を0%にする
MV1SetAmbColorScale( ModelHandle, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x の不透明度を上下キーで操作できるようにした上で、 画面上に MV1GetSemiTransState 関数の戻り値を表示して半透明要素があるかどうかを確認できるようにしています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float OpacityRate ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 不透明度を初期化
OpacityRate = 1.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 上キーが押されたら不透明度を上げる
if( CheckHitKey( KEY_INPUT_UP ) )
{
OpacityRate += 0.05f ;
if( OpacityRate > 1.0f )
{
OpacityRate = 1.0f ;
}
}
// 下キーが押されたら不透明度を下げる
if( CheckHitKey( KEY_INPUT_DOWN ) )
{
OpacityRate -= 0.05f ;
if( OpacityRate < 0.0f )
{
OpacityRate = 0.0f ;
}
}
// 3Dモデルの不透明度を設定する
MV1SetOpacityRate( ModelHandle, OpacityRate ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 現在の不透明度と、MV1GetSemiTransState の戻り値を描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ),
"ESC Key:Exit OpacityRate:%f SemiTransState:%d",
OpacityRate, MV1GetSemiTransState( ModelHandle ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x の不透明度を50%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 透明で描画されているということが分かるように画面全体を赤で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 255,0,0 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの不透明度を50%にする
MV1SetOpacityRate( ModelHandle, 0.5f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル MV1SetMeshUseVertDifColor関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル リアルタイム物理演算モードで Test.pmd を MV1LoadModel で読み込んで リアルタイム物理演算を行いながらキーボードの上下左右でモデルの位置を移動します。 尚、Test.pmd はDXライブラリのパッケージには含まれていませんので、別途用意してください。 PMDのキャラクターは大体同じ大きさですので、カメラの設定などはそのままで問題ないと思います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int PosX, PosZ, PosY ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする
MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "Test.pmd" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラに映る範囲( カメラからの距離の範囲 )を設定
SetCameraNearFar( 10.0f, 1000.0f ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 座標をリセット
PosX = 0 ;
PosY = 0 ;
PosZ = 0 ;
// ウインドウが閉じられるまでループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// キーボードの上下左右でモデルの座標を変更
// ( シフトキーを押しながら上下キーでモデルを上下に移動 )
if( CheckHitKey( KEY_INPUT_LSHIFT ) )
{
if( CheckHitKey( KEY_INPUT_DOWN ) ) PosY -- ;
if( CheckHitKey( KEY_INPUT_UP ) ) PosY ++ ;
}
else
{
if( CheckHitKey( KEY_INPUT_LEFT ) ) PosX -- ;
if( CheckHitKey( KEY_INPUT_RIGHT ) ) PosX ++ ;
if( CheckHitKey( KEY_INPUT_DOWN ) ) PosZ -- ;
if( CheckHitKey( KEY_INPUT_UP ) ) PosZ ++ ;
}
// モデルの座標をセット
MV1SetPosition( ModelHandle, VGet( PosX * 0.5f, PosY * 0.5f, PosZ * 0.5f ) ) ;
// 物理演算を60分の1秒経過したという想定で実行
MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル リアルタイム物理演算モードで Test.pmd を MV1LoadModel で読み込んで リアルタイム物理演算を行いながらキーボードの上下左右でモデルの位置を移動します。 スペースキーが押されたらモデルを原点にワープさせ、MV1PhysicsResetState でモデルの物理演算の状態をリセットします。 尚、Test.pmd はDXライブラリのパッケージには含まれていませんので、別途用意してください。 PMDのキャラクターは大体同じ大きさですので、カメラの設定などはそのままで問題ないと思います。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int PosX, PosZ, PosY ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする
MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "Test.pmd" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラに映る範囲( カメラからの距離の範囲 )を設定
SetCameraNearFar( 10.0f, 1000.0f ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 座標をリセット
PosX = 0 ;
PosY = 0 ;
PosZ = 0 ;
// ウインドウが閉じられるまでループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// キーボードの上下左右でモデルの座標を変更
// ( シフトキーを押しながら上下キーでモデルを上下に移動 )
if( CheckHitKey( KEY_INPUT_LSHIFT ) )
{
if( CheckHitKey( KEY_INPUT_DOWN ) ) PosY -- ;
if( CheckHitKey( KEY_INPUT_UP ) ) PosY ++ ;
}
else
{
if( CheckHitKey( KEY_INPUT_LEFT ) ) PosX -- ;
if( CheckHitKey( KEY_INPUT_RIGHT ) ) PosX ++ ;
if( CheckHitKey( KEY_INPUT_DOWN ) ) PosZ -- ;
if( CheckHitKey( KEY_INPUT_UP ) ) PosZ ++ ;
}
// モデルの座標をセット
MV1SetPosition( ModelHandle, VGet( PosX * 0.5f, PosY * 0.5f, PosZ * 0.5f ) ) ;
// スペースキーが押されたら原点に戻る
if( GetInputChar( TRUE ) == ' ' )
{
PosX = 0 ;
PosY = 0 ;
PosZ = 0 ;
// モデルの座標を原点に移動
MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 0.0f ) ) ;
// モデルの物理演算の状態をリセット
MV1PhysicsResetState( ModelHandle ) ;
}
// 物理演算を60分の1秒経過したという想定で実行
MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| アニメーション関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のアニメーションをループ再生します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex ;
float TotalTime, PlayTime ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
// 何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 再生時間を進める
PlayTime += 100.0f ;
// 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す
if( PlayTime >= TotalTime )
{
PlayTime = 0.0f ;
}
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のアニメーションと1番のアニメーションを交互に再生します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex, PlayAnim ;
float TotalTime, PlayTime ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
// 再生しているアニメーションを0番にする
PlayAnim = 0 ;
// アニメーション0の再生が終わるか、何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 再生時間を進める
PlayTime += 100.0f ;
// 再生時間がアニメーションの総再生時間に達したら次のアニメーションにする
if( PlayTime >= TotalTime )
{
// 再生しているアニメーションを、今までが0番だったら1番に、1番だったら0番にする
if( PlayAnim == 0 )
{
PlayAnim = 1 ;
}
else
{
PlayAnim = 0 ;
}
// 今までアタッチしていたアニメーションのデタッチ
MV1DetachAnim( ModelHandle, AttachIndex ) ;
// 3Dモデルの PlayAnim 番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, PlayAnim, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
}
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のアニメーションの再生時間 10000.0f の状態を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの再生時間を 10000.0f にする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, 10000.0f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のアニメーションの総時間を画面左上に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex ;
float TotalTime ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アニメーション0番の総時間を画面に描画
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "%f", TotalTime ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる直立しているアニメーションから右手を前に出しているアニメーションへ徐々に移行します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AttachIndex1, AttachIndex2 ;
float Rate ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 画面が切り替わるのをちょっと待つ
WaitTimer( 1000 ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルの立っているアニメーション( 4番目のアニメーション )をアタッチする
AttachIndex1 = MV1AttachAnim( ModelHandle, 4, -1, FALSE ) ;
// 3Dモデルの手を前に出しているアニメーション( 5番目のアニメーション )をアタッチする
AttachIndex2 = MV1AttachAnim( ModelHandle, 5, -1, FALSE ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 4番目のアニメーションから5番目のアニメーションに徐々に移行する
for( Rate = 0.0f ; Rate < 1.0f ; Rate += 0.01f )
{
// 画面をクリア
ClearDrawScreen() ;
// 立っているアニメーションのブレンド率をセット
MV1SetAttachAnimBlendRate( ModelHandle, AttachIndex1, 1.0f - Rate ) ;
// 手を前に出しているアニメーションのブレンド率をセット
MV1SetAttachAnimBlendRate( ModelHandle, AttachIndex2, Rate ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映する
ScreenFlip() ;
}
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれるアニメーションの一覧を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AnimNum, i ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルに含まれるアニメーションの数を取得する
AnimNum = MV1GetAnimNum( ModelHandle ) ;
// アニメーションの一覧を描画する
for( i = 0 ; i < AnimNum ; i ++ )
{
// 左から順に、アニメーション番号、アニメーション名、アニメーションの総時間を描画する
DrawFormatString( 0, i * 16, GetColor( 255,255,255 ),
"No:%d Name:%s Time:%f",
i,
MV1GetAnimName( ModelHandle, i ),
MV1GetAnimTotalTime( ModelHandle, i ) ) ;
}
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetAnimNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる Animation_2 という名前のアニメーションを再生します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, AnimIndex, AttachIndex ;
float TotalTime, PlayTime ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// Animation_2 という名前のアニメーションの番号を取得する
AnimIndex = MV1GetAnimIndex( ModelHandle, "Animation_2" ) ;
// 取得したアニメーション番号のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, AnimIndex, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
// 何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 再生時間を進める
PlayTime += 100.0f ;
// 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す
if( PlayTime >= TotalTime )
{
PlayTime = 0.0f ;
}
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetAnimNum関数 のサンプルを参照してください。 | ||||||||||||||
| マテリアル関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれるアニメーションの情報を一つづつ描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, MaterialNum, i ;
COLOR_F Color ;
char *Name ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルに含まれるマテリアルの数を取得する
MaterialNum = MV1GetMaterialNum( ModelHandle ) ;
// マテリアルの情報を一つづつ描画する
for( i = 0 ; i < MaterialNum ; i ++ )
{
// 画面をクリア
ClearDrawScreen() ;
// マテリアルの名前を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Name %s", MV1GetMaterialName( ModelHandle, i ) ) ;
// マテリアルのディフューズカラーを描画
Color = MV1GetMaterialDifColor( ModelHandle, i ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Diffuse Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ;
// マテリアルのスペキュラカラーを描画
Color = MV1GetMaterialSpcColor( ModelHandle, i ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Specular Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ;
// マテリアルのエミッシブカラーを描画
Color = MV1GetMaterialEmiColor( ModelHandle, i ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Emissive Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ;
// マテリアルのアンビエントカラーを描画
Color = MV1GetMaterialAmbColor( ModelHandle, i ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color R:%f G:%f B:%f A:%f", Color.r, Color.g, Color.b, Color.a ) ;
// マテリアルのスペキュラの強さ描画
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Specular Power %f", MV1GetMaterialSpcPower( ModelHandle, i ) ) ;
// 描画ブレンドモードの描画
switch( MV1GetMaterialDrawBlendMode( ModelHandle, i ) )
{
case DX_BLENDMODE_NOBLEND : Name = "DX_BLENDMODE_NOBLEND" ; break ;
case DX_BLENDMODE_ALPHA : Name = "DX_BLENDMODE_ALPHA" ; break ;
case DX_BLENDMODE_ADD : Name = "DX_BLENDMODE_ADD" ; break ;
case DX_BLENDMODE_SUB : Name = "DX_BLENDMODE_SUB" ; break ;
case DX_BLENDMODE_INVSRC : Name = "DX_BLENDMODE_INVSRC" ; break ;
case DX_BLENDMODE_MULA : Name = "DX_BLENDMODE_MULA" ; break ;
}
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Draw Blend Mode %s", Name ) ;
// 描画ブレンドパラメータの描画
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Draw Blend Param %d", MV1GetMaterialDrawBlendParam( ModelHandle, i ) ) ;
// キー入力待ち
WaitKey() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のマテリアルのディフューズカラーを真っ赤にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのディフューズカラーを真っ赤にします
MV1SetMaterialDifColor( ModelHandle, 0, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のマテリアルのスペキュラカラーを緑色にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのスペキュラカラーを緑にします
MV1SetMaterialSpcColor( ModelHandle, 0, GetColorF( 0.0f, 1.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のマテリアルのエミッシブカラーを暗い黄色にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのエミッシブカラーを暗い黄色にします
MV1SetMaterialEmiColor( ModelHandle, 0, GetColorF( 0.2f, 0.2f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のマテリアルのアンビエントカラーを紫色にしてモデルを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのアンビエントカラーを紫色にします
MV1SetMaterialAmbColor( ModelHandle, 0, GetColorF( 1.0f, 0.0f, 1.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のマテリアルのスペキュラの強さを変更します。 ( 変化がわかりにくいので、スペキュラカラーも明るくしています )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのスペキュラカラーを明るくします
MV1SetMaterialSpcColor( ModelHandle, 0, GetColorF( 0.457f, 0.687f, 0.948f, 0.f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルのスペキュラの強さを 0.1f にします
MV1SetMaterialSpcPower( ModelHandle, 0, 19.0f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる4番目のマテリアルにディフューズテクスチャとして使用されている テクスチャの番号を取得して、そのテクスチャのグラフィックハンドルを取得して画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int TexIndex ;
int GrHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// マテリアル番号4で使用されているテクスチャの番号を取得する
TexIndex = MV1GetMaterialDifMapTexture( ModelHandle, 4 ) ;
// モデルで使用されているテクスチャのグラフィックハンドルを取得する
GrHandle = MV1GetTextureGraphHandle( ModelHandle, TexIndex ) ;
// 取得したグラフィックハンドルを画面に描画する
DrawGraph( 0, 0, GrHandle, TRUE ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル マテリアルで使用されているテクスチャを画面に描画するサンプルが MV1GetMaterialDifMapTexture 関数 にあります。 | ||||||||||||||
| ||||||||||||||
|
サンプル マテリアルで使用されているテクスチャを画面に描画するサンプルが MV1GetMaterialDifMapTexture 関数 にあります。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番目のマテリアルの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる1番目のマテリアルの描画ブレンドモードを DX_BLENDMODE_ADD に変更する
MV1SetMaterialDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番目のマテリアルの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更して、 ブレンドパラメータを128にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のマテリアルの描画ブレンドモードを DX_BLENDMODE_ADD に変更する
MV1SetMaterialDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ;
// マテリアルのブレンドパラメータを 128 に変更する
MV1SetMaterialDrawBlendParam( ModelHandle, 1, 128 ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMaterialNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| テクスチャ関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo で使用されているテクスチャの情報を一つづつ描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int i, TextureNum ;
int Width, Height, GrHandle ;
const char *String ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルに含まれるテクスチャの総数を取得する
TextureNum = MV1GetTextureNum( ModelHandle ) ;
// テクスチャの数だけ繰り返し
for( i = 0 ; i < TextureNum ; i ++ )
{
// 画面をクリアする
ClearDrawScreen() ;
// テクスチャのグラフィックハンドルを取得する
GrHandle = MV1GetTextureGraphHandle( ModelHandle, i ) ;
// テクスチャの名前を描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Name %s", MV1GetTextureName( ModelHandle, i ) ) ;
// テクスチャの大きさを描画する
GetGraphSize( GrHandle, &Width, &Height ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Size %dx%d", Width, Height ) ;
// テクスチャのU値のアドレスモードを描画する
switch( MV1GetTextureAddressModeU( ModelHandle, i ) )
{
case DX_TEXADDRESS_WRAP : String = "DX_TEXADDRESS_WRAP" ; break ;
case DX_TEXADDRESS_MIRROR : String = "DX_TEXADDRESS_MIRROR" ; break ;
case DX_TEXADDRESS_CLAMP : String = "DX_TEXADDRESS_CLAMP" ; break ;
}
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Address Mode U %s", String ) ;
// テクスチャのV値のアドレスモードを描画する
switch( MV1GetTextureAddressModeV( ModelHandle, i ) )
{
case DX_TEXADDRESS_WRAP : String = "DX_TEXADDRESS_WRAP" ; break ;
case DX_TEXADDRESS_MIRROR : String = "DX_TEXADDRESS_MIRROR" ; break ;
case DX_TEXADDRESS_CLAMP : String = "DX_TEXADDRESS_CLAMP" ; break ;
}
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Address Mode V %s", String ) ;
// テクスチャのフィルタリングモードを描画する
switch( MV1GetTextureSampleFilterMode( ModelHandle, i ) )
{
case DX_DRAWMODE_NEAREST : String = "DX_DRAWMODE_NEAREST" ; break ;
case DX_DRAWMODE_BILINEAR : String = "DX_DRAWMODE_BILINEAR" ; break ;
case DX_DRAWMODE_ANISOTROPIC : String = "DX_DRAWMODE_ANISOTROPIC" ; break ;
}
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Sample Filter Mode %s", String ) ;
// テクスチャを描画する
DrawGraph( 0, 80, GrHandle, TRUE ) ;
// キー入力待ち
WaitKey() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTextureNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x で使用されている目のテクスチャを緑色の目の画像に変更します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int GrHandle ;
int TexIndex ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 緑色の目の画像の読みこみ
GrHandle = LoadGraph( "DxCharaEye2.tga" ) ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルを画面に映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 400.0f ) ) ;
// 目の部分のマテリアルで使用されているテクスチャの番号を取得
TexIndex = MV1GetMaterialDifMapTexture( ModelHandle, 4 ) ;
// テクスチャで使用するグラフィックハンドルを変更する
MV1SetTextureGraphHandle( ModelHandle, TexIndex, GrHandle, FALSE ) ;
// モデルを描画する
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTextureNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル AddressTest.mqo で使用されているテクスチャのアドレスモードを、横方向は DX_TEXADDRESS_MIRROR に 縦方向は DX_TEXADDRESS_CLAMP にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "AddressTest.mqo" ) ;
// モデルを画面に映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 400.0f ) ) ;
// テクスチャ0番のアドレスモードを横方向は DX_TEXADDRESS_MIRROR に、
// 縦方向は DX_TEXADDRESS_CLAMP に変更する
MV1SetTextureAddressMode( ModelHandle, 0, DX_TEXADDRESS_MIRROR, DX_TEXADDRESS_CLAMP ) ;
// モデルを描画する
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTextureNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTextureNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル FilterTest.mqo で使用されているテクスチャのフィルタリングモードを DX_DRAWMODE_NEAREST にして描画します。 ドットとドットの間がくっきり分かれた見た目になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "FilterTest.mqo" ) ;
// モデルを画面に映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 400.0f ) ) ;
// テクスチャ0番のフィルタリングモードを DX_DRAWMODE_NEAREST に変更
MV1SetTextureSampleFilterMode( ModelHandle, 0, DX_DRAWMODE_NEAREST ) ;
// モデルを描画する
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTextureNum関数 のサンプルを参照してください。 | ||||||||||||||
| フレーム関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれるフレームの情報を一つづつ表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, FrameNum, i, Parent ;
VECTOR Position ;
MATRIX Matrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// フレームの数を取得する
FrameNum = MV1GetFrameNum( ModelHandle ) ;
// フレームの数だけループ
for( i = 0 ; i < FrameNum ; i ++ )
{
// 画面をクリア
ClearDrawScreen() ;
// フレーム名の描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Name %s", MV1GetFrameName( ModelHandle, i ) ) ;
// 親フレーム名の描画
Parent = MV1GetFrameParent( ModelHandle, i ) ;
if( Parent == -2 )
{
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Parent Name None" ) ;
}
else
{
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Parent Name %s", MV1GetFrameName( ModelHandle, Parent ) ) ;
}
// 子フレームの数を描画
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Child Num %d", MV1GetFrameChildNum( ModelHandle, i ) ) ;
// フレームのワールド座標の描画
Position = MV1GetFramePosition( ModelHandle, i ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Position x:%f y:%f z:%f", Position.x, Position.y, Position.z ) ;
// 変換行列を描画する
Matrix = MV1GetFrameLocalMatrix( ModelHandle, i ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), " Matrix %f %f %f %f", Matrix.m[ 0 ][ 0 ], Matrix.m[ 0 ][ 1 ], Matrix.m[ 0 ][ 2 ], Matrix.m[ 0 ][ 3 ] ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 1 ][ 0 ], Matrix.m[ 1 ][ 1 ], Matrix.m[ 1 ][ 2 ], Matrix.m[ 1 ][ 3 ] ) ;
DrawFormatString( 0, 96, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 2 ][ 0 ], Matrix.m[ 2 ][ 1 ], Matrix.m[ 2 ][ 2 ], Matrix.m[ 2 ][ 3 ] ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 3 ][ 0 ], Matrix.m[ 3 ][ 1 ], Matrix.m[ 3 ][ 2 ], Matrix.m[ 3 ][ 3 ] ) ;
// フレームのローカル座標からワールド座標に変換する行列を描画する
Matrix = MV1GetFrameLocalWorldMatrix( ModelHandle, i ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "LW Matrix %f %f %f %f", Matrix.m[ 0 ][ 0 ], Matrix.m[ 0 ][ 1 ], Matrix.m[ 0 ][ 2 ], Matrix.m[ 0 ][ 3 ] ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 1 ][ 0 ], Matrix.m[ 1 ][ 1 ], Matrix.m[ 1 ][ 2 ], Matrix.m[ 1 ][ 3 ] ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 2 ][ 0 ], Matrix.m[ 2 ][ 1 ], Matrix.m[ 2 ][ 2 ], Matrix.m[ 2 ][ 3 ] ) ;
DrawFormatString( 0, 176, GetColor( 255,255,255 ), " %f %f %f %f", Matrix.m[ 3 ][ 0 ], Matrix.m[ 3 ][ 1 ], Matrix.m[ 3 ][ 2 ], Matrix.m[ 3 ][ 3 ] ) ;
// フレームの表示状態を描画
DrawFormatString( 0, 192, GetColor( 255,255,255 ), "Visible %d", MV1GetFrameVisible( ModelHandle, i ) ) ;
// フレームに半透明要素があるかどうかを描画
DrawFormatString( 0, 208, GetColor( 255,255,255 ), "Semi Trans %d", MV1GetFrameSemiTransState( ModelHandle, i ) ) ;
// フレームに含まれるメッシュの数を描画
DrawFormatString( 0, 224, GetColor( 255,255,255 ), "Mesh Num %d", MV1GetFrameMeshNum( ModelHandle, i ) ) ;
// フレームに含まれる三角形ポリゴンの数を描画
DrawFormatString( 0, 240, GetColor( 255,255,255 ), "Triangle Num %d", MV1GetFrameTriangleNum( ModelHandle, i ) ) ;
// キーの入力待ち
WaitKey() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる名前が Mesh_1 のフレームの番号を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// フレーム名 Mesh_1 のフレームの番号を画面に描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "%d", MV1SearchFrame( ModelHandle, "Mesh_1" ) ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる2番目のフレームの子フレームの中から Koshi という名前のフレームの番号を検索します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルの2番目のフレームが持つ子フレームの中から AnkleR という名前のフレームの番号を検索して画面に描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "%d", MV1SearchFrameChild( ModelHandle, 2, "AnkleR" ) ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる0番目のフレームの子フレームの名前を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, i, ChildNum, FrameIndex ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// フレーム0番の子フレームの数を取得
ChildNum = MV1GetFrameChildNum( ModelHandle, 0 ) ;
// 子フレームの数だけループ
for( i = 0 ; i < ChildNum ; i ++ )
{
// 子フレームのフレーム番号を取得
FrameIndex = MV1GetFrameChild( ModelHandle, 0, i ) ;
// 子フレームの名前を表示
DrawFormatString( 0, i * 16, GetColor( 255,255,255 ), "%s", MV1GetFrameName( ModelHandle, FrameIndex ) ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameChildNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる2番目のフレームの変換行列を下方向に 300.0f 移動する 行列にしてから描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルを見える位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 800.0f ) ) ;
// 2番目のフレームに下に動くのローカル行列をセットする
MV1SetFrameUserLocalMatrix( ModelHandle, 2, MGetTranslate( VGet( 0.0f, -300.0f, 0.0f ) ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる2番目のフレームの変換行列を下方向に 300.0f 移動する 行列をセットしたり解除したりを1秒単位で行いつつ描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, Time, UseMatrix ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルを見える位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 800.0f ) ) ;
// 行列を使用するかどうかのフラグを1にする
UseMatrix = 1 ;
// 現在のタイムカウントを記録しておく
Time = GetNowCount() ;
// 何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 1秒経つ毎に独自の行列を使用するかどうかを変更する
if( GetNowCount() - Time > 1000 )
{
// フラグによって処理を分岐
if( UseMatrix == 1 )
{
// 2番目のフレームに下に動くのローカル行列をセットする
MV1SetFrameUserLocalMatrix( ModelHandle, 2, MGetTranslate( VGet( 0.0f, -300.0f, 0.0f ) ) ) ;
// フラグを0にする
UseMatrix = 0 ;
}
else
{
// 2番目のフレームに設定した行列を無効化する
MV1ResetFrameUserLocalMatrix( ModelHandle, 2 ) ;
// フラグを1にする
UseMatrix = 1 ;
}
// 現在のタイムカウントを記録しておく
Time = GetNowCount() ;
}
// モデルを描画
MV1DrawModel( ModelHandle ) ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる1番目のフレームの表示状態を「非表示」にして描画します。 「円柱」フレームの子フレームである「子円柱」も一緒に表示されなくなります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 1番のフレームの表示状態を「非表示」にする
MV1SetFrameVisible( ModelHandle, 1, FALSE ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる3番目のフレームのディフューズカラーを赤にします。 「立方体」フレームの子フレームである「子立方体」も一緒に赤色になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 3番のフレームのディフューズカラーを赤にする
MV1SetFrameDifColorScale( ModelHandle, 3, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる1番目のフレームのスペキュラカラーを黄色にします。 「円柱」フレームの子フレームである「子円柱」も一緒に黄色になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 1番のフレームのスペキュラカラーを黄色にする
MV1SetFrameSpcColorScale( ModelHandle, 1, GetColorF( 1.0f, 1.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる1番目のフレームのエミッシブカラーを水色にします。 「円柱」フレームの子フレームである「子円柱」も一緒に水色になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 1番のフレームのエミッシブカラーのスケール値を水色にする
MV1SetFrameEmiColorScale( ModelHandle, 1, GetColorF( 0.0f, 1.0f, 1.0f, 0.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる1番目のフレームのアンビエントカラーを紫色にします。 「円柱」フレームの子フレームである「子円柱」も一緒に水色になります。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 1番のフレームのアンビエントカラーのスケール値を紫色にする
MV1SetFrameAmbColorScale( ModelHandle, 1, GetColorF( 1.0f, 0.0f, 1.0f, 0.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の3番目のフレームの不透明度を上下キーで操作できるようにした上で、 画面上に MV1GetFrameSemiTransState 関数の戻り値を表示して半透明要素があるかどうかを確認できるようにしています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float OpacityRate ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 100.0f, 600.0f ) ) ;
// 不透明度を初期化
OpacityRate = 1.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 上キーが押されたら不透明度を上げる
if( CheckHitKey( KEY_INPUT_UP ) )
{
OpacityRate += 0.05f ;
if( OpacityRate > 1.0f )
{
OpacityRate = 1.0f ;
}
}
// 下キーが押されたら不透明度を下げる
if( CheckHitKey( KEY_INPUT_DOWN ) )
{
OpacityRate -= 0.05f ;
if( OpacityRate < 0.0f )
{
OpacityRate = 0.0f ;
}
}
// 3番目のフレームの不透明度を設定する
MV1SetFrameOpacityRate( ModelHandle, 3, OpacityRate ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 現在の3番目のフレームの不透明度と、MV1GetFrameOpacityState の戻り値を描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ),
"ESC Key:Exit OpacityRate:%f SemiTransState:%d",
OpacityRate, MV1GetFrameSemiTransState( ModelHandle, 3 ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の1番目のフレームの不透明度を50%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 透明で描画されているということが分かるように画面全体を赤で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 255,0,0 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 100.0f, 600.0f ) ) ;
// 3Dモデルの1番目のフレームの不透明度を50%にする
MV1SetFrameOpacityRate( ModelHandle, 1, 0.5f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル TexAddrTransfTest.mqo を約1秒毎にテクスチャ座標をずらしてアニメーションさせます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int WaitCounter, ViewPattern ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "TexAddrTransfTest.mqo" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 描画するパターンと、描画パターンを変更する間隔をカウントする変数の初期化
ViewPattern = 0 ;
WaitCounter = 0 ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 描画するパターンを変更する処理
WaitCounter ++ ;
if( WaitCounter == 60 )
{
WaitCounter = 0 ;
// 60フレーム経過したら描画パターンを変更
ViewPattern ++ ;
if( ViewPattern == 4 )
{
ViewPattern = 0 ;
}
}
// 描画するパターンに応じてテクスチャ座標のU値をずらす値を変更
MV1SetFrameTextureAddressTransform( ModelHandle, 0, 0.25f * ViewPattern, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x の1番目のフレームに含まれるメッシュの情報を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, MeshNum, i, MeshIndex ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 1番目のフレームに含まれるメッシュの数を取得する
MeshNum = MV1GetFrameMeshNum( ModelHandle, 1 ) ;
// メッシュの数だけループ
for( i = 0 ; i < MeshNum ; i ++ )
{
// メッシュ番号の取得
MeshIndex = MV1GetFrameMesh( ModelHandle, 1, i ) ;
// メッシュが使用しているマテリアルとメッシュに含まれる三角形ポリゴンの数を描画
DrawFormatString( 0, i * 16, GetColor( 255,255,255 ), "Mesh No %d Material %d Triangle Polygon Num %d",
i, MV1GetMeshMaterial( ModelHandle, MeshIndex ), MV1GetMeshTriangleNum( ModelHandle, MeshIndex ) ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetFrameMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| メッシュ関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれるメッシュの情報を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, MeshNum, i ;
VECTOR Position ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルに含まれるメッシュの数を取得する
MeshNum = MV1GetMeshNum( ModelHandle ) ;
// メッシュの数だけループ
for( i = 0 ; i < MeshNum ; i ++ )
{
// 画面をクリア
ClearDrawScreen() ;
// メッシュが使用しているマテリアルの描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Material %d", MV1GetMeshMaterial( ModelHandle, i ) ) ;
// メッシュに含まれる三角形ポリゴンの数を描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Triangle Polygon Num %d", MV1GetMeshTriangleNum( ModelHandle, i ) ) ;
// メッシュの表示・非表示状態を描画
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Visible %d", MV1GetMeshVisible( ModelHandle, i ) ) ;
// メッシュに半透明要素があるかどうかを描画
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Semi Trans State %d", MV1GetMeshSemiTransState( ModelHandle, i ) ) ;
// メッシュがバックカリングを行うかどうかを描画
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Back Culling %d", MV1GetMeshBackCulling( ModelHandle, i ) ) ;
// メッシュの頂点ディフューズカラーを使用するかどうかを描画
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Use Vertex Dif Color %d", MV1GetMeshUseVertDifColor( ModelHandle, i ) ) ;
// メッシュの頂点スペキュラカラーを使用するかどうかを描画
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Use Vertex Spc Color %d", MV1GetMeshUseVertSpcColor( ModelHandle, i ) ) ;
// メッシュに含まれる頂点のローカル座標の最大座標値を描画
Position = MV1GetMeshMaxPosition( ModelHandle, i ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Max Position x %f y %f z %f", Position.x, Position.y, Position.z ) ;
// メッシュに含まれる頂点のローカル座標の最小座標値を描画
Position = MV1GetMeshMinPosition( ModelHandle, i ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Min Position x %f y %f z %f", Position.x, Position.y, Position.z ) ;
// キーの入力待ち
WaitKey() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番目のメッシュを非表示にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 1番のメッシュの表示状態を「非表示」にする
MV1SetMeshVisible( ModelHandle, 1, FALSE ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる0番のメッシュのディフューズカラーを赤にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 0番のメッシュのディフューズカラーを赤にする
MV1SetMeshDifColorScale( ModelHandle, 0, GetColorF( 1.0f, 0.0f, 0.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番のメッシュのスペキュラカラーを緑にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 1番のメッシュのスペキュラカラーを緑にする
MV1SetMeshSpcColorScale( ModelHandle, 1, GetColorF( 0.0f, 1.0f, 0.0f, 0.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる1番のメッシュのエミッシブカラーを青にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 1番のメッシュのエミッシブカラーを青にする
MV1SetMeshEmiColorScale( ModelHandle, 1, GetColorF( 0.0f, 0.0f, 1.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo に含まれる3番のメッシュのアンビエントカラーを黄色にします。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 3番のメッシュのアンビエントカラーを黄色にする
MV1SetMeshAmbColorScale( ModelHandle, 3, GetColorF( 0.0f, 0.0f, 1.0f, 1.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の0番目のメッシュの不透明度を50%にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 透明で描画されているということが分かるように画面全体を赤で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 255,0,0 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 100.0f, 600.0f ) ) ;
// 3Dモデルの0番目のメッシュの不透明度を50%にする
MV1SetMeshOpacityRate( ModelHandle, 0, 0.5f ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番目のメッシュの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる1番目のメッシュの描画ブレンドモードを DX_BLENDMODE_ADD に変更する
MV1SetMeshDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれる1番目のメッシュの描画ブレンドモードを加算ブレンド( DX_BLENDMODE_ADD )に変更して、 ブレンドパラメータを128にして描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ブレンドモードが変更されたことがわかるように画面全体を青色で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 3Dモデルに含まれる1番目のメッシュの描画ブレンドモードを DX_BLENDMODE_ADD に変更する
MV1SetMeshDrawBlendMode( ModelHandle, 1, DX_BLENDMODE_ADD ) ;
// モデルに含まれる1番目のメッシュのブレンドパラメータを 128 に変更する
MV1SetMeshDrawBlendParam( ModelHandle, 1, 128 ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル BackCulling.mqo に含まれる0番目のメッシュのバックカリングを有効な状態と無効にした状態での2パターンで描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "BackCulling.mqo" ) ;
// バックカリングされているのがわかり易いように画面全体を青で塗りつぶす
DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 490.0f, 50.0f, 600.0f ) ) ;
// 最初は何もせずに3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// 最初の位置から少し移動
MV1SetPosition( ModelHandle, VGet( 50.0f, 50.0f, 600.0f ) ) ;
// 3Dモデルに含まれる0番目のバックカリングを無効にする
MV1SetMeshBackCulling( ModelHandle, 0, FALSE ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x の1番目のメッシュに含まれるトライアングルリストの情報を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, TriangleListNum, i, TriangleListIndex ;
int y ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 1番目のメッシュに含まれるトライアングルリストの数を取得する
TriangleListNum = MV1GetMeshTListNum( ModelHandle, 1 ) ;
// トライアングルリストの数だけループ
y = 0 ;
for( i = 0 ; i < TriangleListNum ; i ++ )
{
// トライアングルリスト番号の取得
TriangleListIndex = MV1GetMeshTList( ModelHandle, 1, i ) ;
// トライアングルリスト番号を描画
DrawFormatString( 0, y, GetColor( 255,255,255 ), "TriangleListIndex %d", TriangleListIndex ) ;
// トライアングルリストの頂点タイプを描画
switch( MV1GetTriangleListVertexType( ModelHandle, TriangleListIndex ) )
{
case DX_MV1_VERTEX_TYPE_1FRAME :
DrawString( 0, y + 16, "頂点タイプ:1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_4FRAME :
DrawString( 0, y + 16, "頂点タイプ:1〜4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_8FRAME :
DrawString( 0, y + 16, "頂点タイプ:1〜8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_FREE_FRAME :
DrawString( 0, y + 16, "頂点タイプ:9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_1FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_4FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1〜4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_8FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1〜8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_FREE_FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
}
// トライアングルリストのポリゴン数と頂点数を描画
DrawFormatString( 0, y + 32, GetColor( 255,255,255 ), "ポリゴン数:%-5d 頂点数:%-5d",
MV1GetTriangleListPolygonNum( ModelHandle, TriangleListIndex ),
MV1GetTriangleListVertexNum( ModelHandle, TriangleListIndex ) ) ;
// 描画Y座標を進める
y += 64 ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshTListNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x の0番目のメッシュの不透明度を上下キーで操作できるようにした上で、 画面上に MV1GetMeshSemiTransState 関数の戻り値を表示して半透明要素があるかどうかを確認できるようにしています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float OpacityRate ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 不透明度を初期化
OpacityRate = 1.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 上キーが押されたら不透明度を上げる
if( CheckHitKey( KEY_INPUT_UP ) )
{
OpacityRate += 0.05f ;
if( OpacityRate > 1.0f )
{
OpacityRate = 1.0f ;
}
}
// 下キーが押されたら不透明度を下げる
if( CheckHitKey( KEY_INPUT_DOWN ) )
{
OpacityRate -= 0.05f ;
if( OpacityRate < 0.0f )
{
OpacityRate = 0.0f ;
}
}
// 3Dモデルの1番目のメッシュの不透明度を設定する
MV1SetMeshOpacityRate( ModelHandle, 1, OpacityRate ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 現在の不透明度と、MV1GetMeshSemiTransState の戻り値を描画する
DrawFormatString( 0, 0, GetColor( 255,255,255 ),
"ESC Key:Exit OpacityRate:%f SemiTransState:%d",
OpacityRate, MV1GetMeshSemiTransState( ModelHandle, 1 ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModelVertexColor.mqo を最初は普通に描画し、キーが押された後3番目のメッシュの頂点ディフューズカラーを 有効にして( マテリアルのディフューズカラーを無効にして )再度モデルを描画します。 3番目のメッシュの頂点ディフューズカラーは真っ黒なので、キーが押された後はエミッシブカラー( 自己発光色 )と アンビエントカラー( 環境光色 )のみの平坦な見た目に変化します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModelVertexColor.mqo" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// 画面をクリア
ClearDrawScreen() ;
// 3番目のメッシュの頂点ディフューズカラーを使用する設定に変更する
MV1SetMeshUseVertDifColor( ModelHandle, 3, TRUE ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetMeshNum関数 のサンプルを参照してください。 | ||||||||||||||
| トライアングルリスト関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル DxChara.x に含まれるトライアングルリストの情報を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, TriangleListNum, i ;
int y ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// モデルに含まれるトライアングルリストの数を取得する
TriangleListNum = MV1GetTriangleListNum( ModelHandle ) ;
// トライアングルリストの数だけループ
y = 0 ;
for( i = 0 ; i < TriangleListNum ; i ++ )
{
// トライアングルリスト番号を描画
DrawFormatString( 0, y, GetColor( 255,255,255 ), "No %d", i ) ;
// トライアングルリストのポリゴン数と頂点数を描画
DrawFormatString( 48, y, GetColor( 255,255,255 ), "ポリゴン数:%-5d 頂点数:%-5d",
MV1GetTriangleListPolygonNum( ModelHandle, i ),
MV1GetTriangleListVertexNum( ModelHandle, i ) ) ;
// トライアングルリストの頂点タイプを描画
switch( MV1GetTriangleListVertexType( ModelHandle, i ) )
{
case DX_MV1_VERTEX_TYPE_1FRAME :
DrawString( 0, y + 16, "頂点タイプ:1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_4FRAME :
DrawString( 0, y + 16, "頂点タイプ:1〜4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_8FRAME :
DrawString( 0, y + 16, "頂点タイプ:1〜8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_FREE_FRAME :
DrawString( 0, y + 16, "頂点タイプ:9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_1FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_4FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1〜4フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_8FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる1〜8フレームの影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
case DX_MV1_VERTEX_TYPE_NMAP_FREE_FRAME :
DrawString( 0, y + 16, "頂点タイプ:法線マップ用の情報が含まれる9フレーム以上の影響を受ける頂点", GetColor( 255,255,255 ) ) ;
break ;
}
// 描画Y座標を進める
y += 32 ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTriangleListNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTriangleListNum関数 のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MV1GetTriangleListNum関数 のサンプルを参照してください。 | ||||||||||||||
| コリジョン( 衝突判定 )関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の0番目のフレーム( 中心の球体 )と線分の当たり判定をし、 当たったところまで線分を描画します。 あと、当たっているのかどうかを判断するために上下キーで線分を移動できるようにしています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float y ;
VECTOR StartPos, EndPos ;
MV1_COLL_RESULT_POLY HitPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// モデルの0番目のフレームのコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, 0, 8, 8, 8 ) ;
// 当たり判定用のラインを出すY座標を初期化
y = 300.0f ;
// ウインドウが閉じられるかESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 上下キーで線分の y 座標を操作できる
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
y += 16.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
y -= 16.0f ;
}
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 0番のフレームと線分との当たり判定
StartPos = VGet( 0.0f, y, 600.0f ) ;
EndPos = VGet( 1000.0f, y, 600.0f ) ;
HitPoly = MV1CollCheck_Line( ModelHandle, 0, StartPos, EndPos ) ;
// 当たった場合はその位置を描画する線分の終点とする
if( HitPoly.HitFlag == 1 )
{
EndPos = HitPoly.HitPosition ;
}
// 線分の描画
DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ;
// 当たったかどうかを表示する
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HIT:%d", HitPoly.HitFlag ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の0番目のフレーム( 中心の球体 )と線分の当たり判定をし、 当たったところまで線分を描画します。 そして、モデルを上下に動かしながら MV1RefreshCollInfo でコリジョン情報を更新しています。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y ;
VECTOR StartPos, EndPos ;
MV1_COLL_RESULT_POLY HitPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデルの0番目のフレームのコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, 0, 8, 8, 8 ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるかESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < -300 || y > 300 )
Add = -Add ;
// 3Dモデルの位置を変更する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f + y, 600.0f ) ) ;
// 0番目のフレームのコリジョン情報を更新する
MV1RefreshCollInfo( ModelHandle, 0 ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 0番のフレームと線分との当たり判定
StartPos = VGet( 0.0f, 300.0f, 600.0f ) ;
EndPos = VGet( 1000.0f, 300.0f, 600.0f ) ;
HitPoly = MV1CollCheck_Line( ModelHandle, 0, StartPos, EndPos ) ;
// 当たった場合はその位置を描画する線分の終点とする
if( HitPoly.HitFlag == 1 )
{
EndPos = HitPoly.HitPosition ;
}
// 線分の描画
DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ;
// 当たったかどうかを表示する
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HIT:%d", HitPoly.HitFlag ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo と上下に動く線分との当たり判定をして、当たったところまでの線分の描画と、 当たり判定の結果を画面に描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y ;
VECTOR StartPos, EndPos ;
MV1_COLL_RESULT_POLY HitPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデル全体のコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < 0 || y > 600 )
Add = -Add ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// モデルと線分との当たり判定
StartPos = VGet( -300.0f, y, 600.0f ) ;
EndPos = VGet( 1000.0f, y, 600.0f ) ;
HitPoly = MV1CollCheck_Line( ModelHandle, -1, StartPos, EndPos ) ;
// 当たった場合はその位置を描画する線分の終点とする
if( HitPoly.HitFlag == 1 )
{
EndPos = HitPoly.HitPosition ;
}
// 線分の描画
DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ;
// 当たったかどうかで処理を分岐
if( HitPoly.HitFlag == 1 )
{
// 当たった場合は衝突の情報を描画する
// 交差した座標を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Pos %f %f %f",
HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ;
// 当たったポリゴンが含まれるフレームの番号を描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Frame %d", HitPoly.FrameIndex ) ;
// 当たったポリゴンが使用しているマテリアルの番号を描画
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Material %d", HitPoly.MaterialIndex ) ;
// 当たったポリゴンを形成する三頂点の座標を描画
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Position %f %f %f",
HitPoly.Position[ 0 ].x, HitPoly.Position[ 0 ].y, HitPoly.Position[ 0 ].z ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), " %f %f %f",
HitPoly.Position[ 1 ].x, HitPoly.Position[ 1 ].y, HitPoly.Position[ 1 ].z ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), " %f %f %f",
HitPoly.Position[ 2 ].x, HitPoly.Position[ 2 ].y, HitPoly.Position[ 2 ].z ) ;
// 当たったポリゴンの法線を描画
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Normal %f %f %f",
HitPoly.Normal.x, HitPoly.Normal.y, HitPoly.Normal.z ) ;
}
else
{
// 当たらなかった場合は衝突しなかった旨だけ描画する
DrawString( 0, 0, "NO HIT", GetColor( 255,255,255 ) ) ;
}
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo と上下に動く球の当たり判定をして、球と当たったポリゴンとの最近点を表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y, i ;
VECTOR SpherePos ;
MV1_COLL_RESULT_POLY_DIM HitPolyDim ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデル全体のコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < 0 || y > 600 )
Add = -Add ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 当たり判定を行う球の位置をセット
SpherePos = VGet( 250.0f, y, 600.0f ) ;
// モデルと球との当たり判定
HitPolyDim = MV1CollCheck_Sphere( ModelHandle, -1, SpherePos, 100.0f ) ;
// 球の描画
DrawSphere3D( SpherePos, 100.0f, 8, GetColor( 255,255,0 ), GetColor( 255,255,255 ), FALSE ) ;
// 当たったかどうかで処理を分岐
if( HitPolyDim.HitNum >= 1 )
{
// 当たった場合は衝突の情報を描画する
// 当たったポリゴンの数を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Poly Num %d", HitPolyDim.HitNum ) ;
// 当たったポリゴンの数だけ繰り返し
for( i = 0 ; i < HitPolyDim.HitNum ; i ++ )
{
// 当たったポリゴンを描画
DrawTriangle3D(
HitPolyDim.Dim[ i ].Position[ 0 ],
HitPolyDim.Dim[ i ].Position[ 1 ],
HitPolyDim.Dim[ i ].Position[ 2 ], GetColor( 0,255,255 ), TRUE ) ;
}
}
// 当たり判定情報の後始末
MV1CollResultPolyDimTerminate( HitPolyDim ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo と上下に動くカプセルの当たり判定をして、カプセルと当たったポリゴンとの最近点を表示します。
#include "DxLib.h"
// カプセルの高さ
#define CAPSULE_H 64.0f
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y, i ;
VECTOR CapsulePos1, CapsulePos2 ;
MV1_COLL_RESULT_POLY_DIM HitPolyDim ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデル全体のコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < 0 || y > 600 )
Add = -Add ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 当たり判定を行う球の位置をセット
CapsulePos1 = VGet( 250.0f, y, 600.0f ) ;
CapsulePos2 = VGet( 250.0f, y + CAPSULE_H, 600.0f ) ;
// モデルとカプセルとの当たり判定
HitPolyDim = MV1CollCheck_Capsule( ModelHandle, -1, CapsulePos1, CapsulePos2, 100.0f ) ;
// カプセルの描画
DrawCapsule3D( CapsulePos1, CapsulePos2, 100.0f, 8, GetColor( 255,255,0 ), GetColor( 255,255,255 ), FALSE ) ;
// 当たったかどうかで処理を分岐
if( HitPolyDim.HitNum >= 1 )
{
// 当たった場合は衝突の情報を描画する
// 当たったポリゴンの数を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Poly Num %d", HitPolyDim.HitNum ) ;
// 当たったポリゴンの数だけ繰り返し
for( i = 0 ; i < HitPolyDim.HitNum ; i ++ )
{
// 当たったポリゴンを描画
DrawTriangle3D(
HitPolyDim.Dim[ i ].Position[ 0 ],
HitPolyDim.Dim[ i ].Position[ 1 ],
HitPolyDim.Dim[ i ].Position[ 2 ], GetColor( 0,255,255 ), TRUE ) ;
}
}
// 当たり判定情報の後始末
MV1CollResultPolyDimTerminate( HitPolyDim ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo と上下に動く球の当たり判定をして、球と当たったポリゴンとの最近点を表示します。 ( MV1CollCheck_Sphere 関数のサンプルを MV1CollCheck_GetResultPoly を使用するように変更したものです )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y, i ;
VECTOR SpherePos ;
MV1_COLL_RESULT_POLY_DIM HitPolyDim ;
MV1_COLL_RESULT_POLY HitPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// モデル全体のコリジョン情報を構築
MV1SetupCollInfo( ModelHandle, -1, 8, 8, 8 ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < 0 || y > 600 )
Add = -Add ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 当たり判定を行う球の位置をセット
SpherePos = VGet( 250.0f, y, 600.0f ) ;
// モデルと球との当たり判定
HitPolyDim = MV1CollCheck_Sphere( ModelHandle, -1, SpherePos, 100.0f ) ;
// 球の描画
DrawSphere3D( SpherePos, 100.0f, 8, GetColor( 255,255,0 ), GetColor( 255,255,255 ), FALSE ) ;
// 当たったかどうかで処理を分岐
if( HitPolyDim.HitNum >= 1 )
{
// 当たった場合は衝突の情報を描画する
// 当たったポリゴンの数を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Hit Poly Num %d", HitPolyDim.HitNum ) ;
// 当たったポリゴンの数だけ繰り返し
for( i = 0 ; i < HitPolyDim.HitNum ; i ++ )
{
// 当たったポリゴンとの最近点の座標を描画
HitPoly = MV1CollCheck_GetResultPoly( HitPolyDim, i ) ;
DrawFormatString( 0, 16 + 16 * i, GetColor( 255,255,255 ), "Position %f %f %f",
HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z ) ;
}
}
// 当たり判定情報の後始末
MV1CollResultPolyDimTerminate( HitPolyDim ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1CollCheck_Sphere関数 のサンプルを参照してください。 | ||||||||||||||
| 参照用メッシュ関係 | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo 全体の参照用メッシュを構築したあと、ポリゴン一枚一枚の座標を利用して モデルのワイヤーフレームを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int i ;
MV1_REF_POLYGONLIST RefPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 3Dモデルを見える位置に移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, 300.0f, 600.0f ) ) ;
// モデル全体の参照用メッシュを構築
MV1SetupReferenceMesh( ModelHandle, -1, TRUE ) ;
// 参照用メッシュ情報の取得
RefPoly = MV1GetReferenceMesh( ModelHandle, -1, TRUE ) ;
// ポリゴンの数だけ繰り返し
for( i = 0 ; i < RefPoly.PolygonNum ; i ++ )
{
// ポリゴンを形成する三頂点を使用してワイヤーフレームを描画する
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position,
GetColor( 255,255,0 ) ) ;
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position,
GetColor( 255,255,0 ) ) ;
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position,
GetColor( 255,255,0 ) ) ;
}
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル モデルファイル SimpleModel.mqo の0番目のフレームの参照用メッシュを構築したあと、上下にモデルを移動しながら ポリゴン一枚一枚の座標を利用して0番目のフレームのワイヤーフレームを描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
int Add, y, i ;
MV1_REF_POLYGONLIST RefPoly ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 0番目のフレームの参照用メッシュを構築
MV1SetupReferenceMesh( ModelHandle, 0, TRUE ) ;
// モデルの進行方向をセット
Add = 8 ;
// モデルの移動位置をセット
y = 0 ;
// ウインドウが閉じられるか何かキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの移動位置を上下に移動させる
y += Add ;
if( y < 0 || y > 600 )
Add = -Add ;
// 3Dモデルを移動する
MV1SetPosition( ModelHandle, VGet( 320.0f, y, 600.0f ) ) ;
// 0番目のフレームの参照用メッシュを更新する
MV1RefreshReferenceMesh( ModelHandle, 0, TRUE ) ;
// 0番目のフレームの参照用メッシュの取得
RefPoly = MV1GetReferenceMesh( ModelHandle, 0, TRUE ) ;
// ポリゴンの数だけ繰り返し
for( i = 0 ; i < RefPoly.PolygonNum ; i ++ )
{
// ポリゴンを形成する三頂点を使用してワイヤーフレームを描画する
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position,
GetColor( 255,255,0 ) ) ;
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 1 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position,
GetColor( 255,255,0 ) ) ;
DrawLine3D(
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 2 ] ].Position,
RefPoly.Vertexs[ RefPoly.Polygons[ i ].VIndex[ 0 ] ].Position,
GetColor( 255,255,0 ) ) ;
}
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MV1SetupReferenceMesh関数 のサンプル、又は MV1RefreshReferenceMesh関数 のサンプルを参照してください。 | ||||||||||||||
| プログラマブルシェーダー関係関数 | ||||||||||||||
| ||||||||||||||
|
サンプル 使用できるシェーダーモデルのバージョンを取得して、シェーダーが使用できるかどうかを画面に表示します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ShaderVersion ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 使用できるプログラマブルシェーダーのバージョンを取得
ShaderVersion = GetValidShaderVersion() ;
// バージョン番号が0だったら使用不可能
if( ShaderVersion == 0 )
{
DrawString( 0, 0, "プログラマブルシェーダーを使うことはできません", GetColor( 255,255,255 ) ) ;
}
else
{
// 0以外だったら使用可能
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "プログラマブルシェーダーバージョン %.1f が使用可能です", ShaderVersion / 100.0f ) ;
}
// キー入力待ち
WaitKey();
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません | ||||||||||||||
| ||||||||||||||
|
サンプル Tex1.bmp を貼り付けたポリゴン2枚を頂点シェーダーを使用して左右に動かし、 ピクセルシェーダーを使用してフェードアウト、フェードインをさせます。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3DSHADER Vertex[ 6 ] ;
int vshandle ;
int pshandle ;
int texhandle ;
int x ;
int xadd ;
float color ;
float coloradd ;
FLOAT4 f4 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 2ポリゴン分の頂点のデータをセットアップ
Vertex[ 0 ].pos = VGet( 220.0f, 340.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 420.0f, 340.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 1.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( 220.0f, 140.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 1.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( 220.0f, 140.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 0.0f ;
Vertex[ 3 ].v = 1.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
Vertex[ 4 ].pos = VGet( 420.0f, 340.0f, 0.0f ) ;
Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 4 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4 ].u = 1.0f ;
Vertex[ 4 ].v = 0.0f ;
Vertex[ 4 ].su = 0.0f ;
Vertex[ 4 ].sv = 0.0f ;
Vertex[ 5 ].pos = VGet( 420.0f, 140.0f, 0.0f ) ;
Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 5 ].dif = GetColorU8( 255, 0, 0,255 ) ;
Vertex[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 5 ].u = 1.0f ;
Vertex[ 5 ].v = 1.0f ;
Vertex[ 5 ].su = 0.0f ;
Vertex[ 5 ].sv = 0.0f ;
// 頂点シェーダーを読み込む
vshandle = LoadVertexShader( "VertexShaderTestVS.vso" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "VertexShaderTestPS.pso" ) ;
// 描画に使用する画像の読み込み
texhandle = LoadGraph( "Tex1.bmp" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 表示座標を移動する処理の初期化
x = 0 ;
xadd = 8 ;
// 色を変化させる処理の初期化
color = 0.0f ;
coloradd = 1.0f / 60.0f ;
// ESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// 座標を移動させる
x += xadd ;
if( x > 200 || x < -200 )
{
xadd = -xadd ;
}
// 色の値を変化させる
color += coloradd ;
if( color <= 0.0f || color >= 1.0f )
{
coloradd = -coloradd ;
}
// 座標値を頂点シェーダー float4型定数0番にセット
f4.x = ( float )x ;
f4.y = 0.0f ;
f4.z = 0.0f ;
f4.w = 0.0f ;
SetVSConstF( 0, f4 ) ;
// 色の値をピクセルシェーダー float4型定数0番にセット
f4.x = color ;
f4.y = color ;
f4.z = color ;
f4.w = 1.0f ;
SetPSConstF( 0, f4 ) ;
// 使用する頂点シェーダーのセット
SetUseVertexShader( vshandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// シェーダーを使用した2ポリゴンの描画
DrawPolygon3DToShader( Vertex, 2 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 使用した頂点シェーダーの float4型定数の設定を無効化する
ResetVSConstF( 0, 2 ) ;
// 使用したピクセルシェーダーの float4型定数の設定を無効化する
ResetPSConstF( 0, 1 ) ;
// 読み込んだ頂点シェーダーの削除
DeleteShader( vshandle ) ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
頂点シェーダーのプログラム( コンパイルして VertexShaderTestVS.vso になる前のHLSLソース )
// 頂点シェーダーの入力
struct VS_INPUT
{
float4 Position : POSITION ; // 座標( VERTEX3DSHADER構造体の pos の値 )
float3 Normal : NORMAL0 ; // 法線( VERTEX3DSHADER構造体の norm の値 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー( VERTEX3DSHADER構造体の dif の値 )
float4 SpecularColor : COLOR1 ; // スペキュラカラー( VERTEX3DSHADER構造体の spc の値 )
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標0( VERTEX3DSHADER構造体の u, v の値 )
float2 TextureCoord1 : TEXCOORD1 ; // テクスチャ座標1( VERTEX3DSHADER構造体の su, sv の値 )
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float4 ProjectionPosition : POSITION ; // 座標( 射影空間 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// C++ 側で設定する定数の定義
float4x4 cfViewMatrix : register( c6 ) ; // ワールド座標をビュー座標に変換する行列の転置行列
float4x4 cfProjectionMatrix : register( c2 ) ; // ビュー座標を射影座標に変換する行列の転置行列
// 頂点座標に加算する値
float4 cfAddPosition : register( c0 ) ;
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lWorldPosition ;
float4 lViewPosition ;
// 入力の頂点座標にC++プログラム側で設定した頂点座標を加算する
lWorldPosition = VSInput.Position + cfAddPosition ;
// 頂点座標をビュー空間の座標に変換する
lViewPosition = mul( lWorldPosition, cfViewMatrix ) ;
// ビュー空間の座標を射影空間の座標に変換する
VSOutput.ProjectionPosition = mul( lViewPosition, cfProjectionMatrix ) ;
// テクスチャ座標はそのまま代入
VSOutput.TextureCoord0 = VSInput.TextureCoord0;
// 頂点カラーはそのまま代入
VSOutput.DiffuseColor = VSInput.DiffuseColor ;
// 関数の戻り値がピクセルシェーダーに渡される
return VSOutput ;
}
ピクセルシェーダーのプログラム( コンパイルして VertexShaderTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 DrawColor : COLOR0 ; // 描画カラー
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// 描画カラーに乗算する値
float4 cfMultiplyColor : register( c0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力する色はテクスチャの色と C++ で設定した値とディフューズカラーを乗算したもの
PSOutput.DrawColor = lTextureColor * cfMultiplyColor * PSInput.DiffuseColor ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ピクセルシェーダーを使って Tex1.bmp の赤成分と青成分を入れ替えて画面に描画します。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int texhandle, pshandle ;
VERTEX2DSHADER Vert[ 6 ] ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// テクスチャを読み込む
texhandle = LoadGraph( "Tex1.bmp" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "PixelShaderTestPS.pso" ) ;
// 2ポリゴン分の頂点のデータをセットアップ
Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ;
Vert[ 0 ].rhw = 1.0f ;
Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 0 ].u = 0.0f ;
Vert[ 0 ].v = 0.0f ;
Vert[ 0 ].su = 0.0f ;
Vert[ 0 ].sv = 0.0f ;
Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 1 ].rhw = 1.0f ;
Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 1 ].u = 1.0f ;
Vert[ 1 ].v = 0.0f ;
Vert[ 1 ].su = 1.0f ;
Vert[ 1 ].sv = 0.0f ;
Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 2 ].rhw = 1.0f ;
Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 2 ].u = 0.0f ;
Vert[ 2 ].v = 1.0f ;
Vert[ 2 ].su = 0.0f ;
Vert[ 2 ].sv = 1.0f ;
Vert[ 3 ].pos = VGet( 256.0f, 256.0f, 0.0f ) ;
Vert[ 3 ].rhw = 1.0f ;
Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 3 ].u = 1.0f ;
Vert[ 3 ].v = 1.0f ;
Vert[ 3 ].su = 1.0f ;
Vert[ 3 ].sv = 1.0f ;
Vert[ 4 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 4 ].rhw = 1.0f ;
Vert[ 4 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 4 ].u = 0.0f ;
Vert[ 4 ].v = 1.0f ;
Vert[ 4 ].su = 0.0f ;
Vert[ 4 ].sv = 1.0f ;
Vert[ 5 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 5 ].rhw = 1.0f ;
Vert[ 5 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 5 ].u = 1.0f ;
Vert[ 5 ].v = 0.0f ;
Vert[ 5 ].su = 1.0f ;
Vert[ 5 ].sv = 0.0f ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// シェーダーを使用した2Dの2ポリゴンの描画
DrawPolygon2DToShader( Vert, 2 ) ;
// キー入力待ち
WaitKey() ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
ピクセルシェーダーのプログラム( コンパイルして PixelShaderTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ;
float4 SpecularColor : COLOR1 ;
float2 TextureCoord0 : TEXCOORD0 ;
float2 TextureCoord1 : TEXCOORD1 ;
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Output : COLOR0 ;
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力する色は青成分と赤成分を逆転したもの
PSOutput.Output.r = lTextureColor.b ;
PSOutput.Output.g = lTextureColor.g ;
PSOutput.Output.b = lTextureColor.r ;
PSOutput.Output.a = lTextureColor.a ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader や LoadPixelShaderのサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル Tex1.bmp を貼り付けたポリゴン2枚を SetVSConstFMtx で設定した回転行列と頂点シェーダーを使用して回転させます。 回転行列を定数10番に設定しているのは定数2〜9番がビュー行列と射影行列の割り当て位置になっているからです。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3DSHADER Vertex[ 6 ] ;
int vshandle ;
int pshandle ;
int texhandle ;
float angle ;
FLOAT4 pos ;
MATRIX mtx ;
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 2ポリゴン分の頂点のデータをセットアップ
Vertex[ 0 ].pos = VGet( -128.0f, 128.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 128.0f, 128.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 1.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( -128.0f, -128.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 1.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( -128.0f, -128.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 0.0f ;
Vertex[ 3 ].v = 1.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
Vertex[ 4 ].pos = VGet( 128.0f, 128.0f, 0.0f ) ;
Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 4 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4 ].u = 1.0f ;
Vertex[ 4 ].v = 0.0f ;
Vertex[ 4 ].su = 0.0f ;
Vertex[ 4 ].sv = 0.0f ;
Vertex[ 5 ].pos = VGet( 128.0f, -128.0f, 0.0f ) ;
Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 5 ].dif = GetColorU8( 255, 0, 0,255 ) ;
Vertex[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 5 ].u = 1.0f ;
Vertex[ 5 ].v = 1.0f ;
Vertex[ 5 ].su = 0.0f ;
Vertex[ 5 ].sv = 0.0f ;
// 頂点シェーダーを読み込む
vshandle = LoadVertexShader( "SetVSConstFMtxTestVS.vso" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "SetVSConstFMtxTestPS.pso" ) ;
// 描画に使用する画像の読み込み
texhandle = LoadGraph( "Tex1.bmp" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 回転角度の値を初期化
angle = 0.0f ;
// 頂点シェーダー FLOAT4型定数0番に表示座標をセット
pos.x = 320.0f ;
pos.y = 240.0f ;
pos.z = 0.0f ;
pos.w = 0.0f ;
SetVSConstF( 0, pos ) ;
// ESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// 回転角度を変化させる
angle += 0.05f ;
// 回転角度からZ軸回転行列を作成
mtx = MGetRotZ( angle ) ;
// 回転行列を頂点シェーダー FLOAT4型定数10〜13番にセット
SetVSConstFMtx( 10, mtx ) ;
// 使用する頂点シェーダーのセット
SetUseVertexShader( vshandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// シェーダーを使用した2ポリゴンの描画
DrawPolygon3DToShader( Vertex, 2 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 使用したfloat4型定数0番の設定を無効化する
ResetVSConstF( 0, 1 ) ;
// 使用したfloat4型定数10〜13番の設定を無効化する
ResetVSConstF( 10, 4 ) ;
// 読み込んだ頂点シェーダーの削除
DeleteShader( vshandle ) ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
頂点シェーダーのプログラム( コンパイルして SetVSConstFMtxTestVS.vso になる前のHLSLソース )
// 頂点シェーダーの入力
struct VS_INPUT
{
float4 Position : POSITION ; // 座標( VERTEX3DSHADER構造体の pos の値 )
float3 Normal : NORMAL0 ; // 法線( VERTEX3DSHADER構造体の norm の値 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー( VERTEX3DSHADER構造体の dif の値 )
float4 SpecularColor : COLOR1 ; // スペキュラカラー( VERTEX3DSHADER構造体の spc の値 )
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標0( VERTEX3DSHADER構造体の u, v の値 )
float2 TextureCoord1 : TEXCOORD1 ; // テクスチャ座標1( VERTEX3DSHADER構造体の su, sv の値 )
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float4 ProjectionPosition : POSITION ; // 座標( 射影空間 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// C++ 側で設定する定数の定義
float4x4 cfViewMatrix : register( c6 ) ; // ワールド座標をビュー座標に変換する行列の転置行列
float4x4 cfProjectionMatrix : register( c2 ) ; // ビュー座標を射影座標に変換する行列の転置行列
// 回転中心になる座標
float4 cfCenterPosition : register( c0 ) ;
// Z回転行列
float4x4 cfRotateZMatrix : register( c10 ) ;
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lWorldPosition ;
float4 lViewPosition ;
// 入力座標にZ回転行列を掛けて座標を回転させる
lWorldPosition = mul( cfRotateZMatrix, VSInput.Position ) ;
// Z回転しただけだと原点に居るので、表示させたい座標に移動する
lWorldPosition += cfCenterPosition ;
// 頂点座標をビュー空間の座標に変換する
lViewPosition = mul( lWorldPosition, cfViewMatrix ) ;
// ビュー空間の座標を射影空間の座標に変換する
VSOutput.ProjectionPosition = mul( lViewPosition, cfProjectionMatrix ) ;
// テクスチャ座標はそのまま代入
VSOutput.TextureCoord0 = VSInput.TextureCoord0;
// 頂点カラーはそのまま代入
VSOutput.DiffuseColor = VSInput.DiffuseColor ;
// 関数の戻り値がピクセルシェーダーに渡される
return VSOutput ;
}
ピクセルシェーダーのプログラム( コンパイルして SetVSConstFMtxTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 DrawColor : COLOR0 ; // 描画カラー
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力する色はテクスチャの色とディフューズカラーを乗算したもの
PSOutput.DrawColor = lTextureColor * PSInput.DiffuseColor ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル Tex1.bmp を貼り付けたポリゴン2枚を SetVSConstFArray を使って予め設定した画面4隅の座標に順番に描画します。 HLSLのソースを見ると分かると思いますが、HLSLで int4 として宣言した変数も内部では FLOAT4型として扱われるので ciPositionIndex の値を設定する関数も SetVSConstF となっています。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3DSHADER Vertex[ 6 ] ;
int vshandle ;
int pshandle ;
int texhandle ;
int posind ;
int poscounter ;
FLOAT4 pos[ 4 ] ;
FLOAT4 f4 ;
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 2ポリゴン分の頂点のデータをセットアップ
Vertex[ 0 ].pos = VGet( -64.0f, 64.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 64.0f, 64.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 1.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( -64.0f, -64.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 1.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( -64.0f, -64.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 0.0f ;
Vertex[ 3 ].v = 1.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
Vertex[ 4 ].pos = VGet( 64.0f, 64.0f, 0.0f ) ;
Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 4 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4 ].u = 1.0f ;
Vertex[ 4 ].v = 0.0f ;
Vertex[ 4 ].su = 0.0f ;
Vertex[ 4 ].sv = 0.0f ;
Vertex[ 5 ].pos = VGet( 64.0f, -64.0f, 0.0f ) ;
Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 5 ].dif = GetColorU8( 255, 0, 0,255 ) ;
Vertex[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 5 ].u = 1.0f ;
Vertex[ 5 ].v = 1.0f ;
Vertex[ 5 ].su = 0.0f ;
Vertex[ 5 ].sv = 0.0f ;
// 頂点シェーダーを読み込む
vshandle = LoadVertexShader( "SetVSConstFArrayTestVS.vso" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "SetVSConstFArrayTestPS.pso" ) ;
// 描画に使用する画像の読み込み
texhandle = LoadGraph( "Tex1.bmp" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 位置番号処理用の値を初期化
posind = 0 ;
poscounter = 0 ;
// 頂点シェーダー FLOAT4型定数10〜13番に表示座標をセット
pos[ 0 ].x = 100.0f ;
pos[ 0 ].y = 100.0f ;
pos[ 0 ].z = 0.0f ;
pos[ 0 ].w = 0.0f ;
pos[ 1 ].x = 540.0f ;
pos[ 1 ].y = 100.0f ;
pos[ 1 ].z = 0.0f ;
pos[ 1 ].w = 0.0f ;
pos[ 2 ].x = 540.0f ;
pos[ 2 ].y = 380.0f ;
pos[ 2 ].z = 0.0f ;
pos[ 2 ].w = 0.0f ;
pos[ 3 ].x = 100.0f ;
pos[ 3 ].y = 380.0f ;
pos[ 3 ].z = 0.0f ;
pos[ 3 ].w = 0.0f ;
SetVSConstFArray( 10, pos, 4 ) ;
// ESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// 一定時間経過したら位置番号を変更する
poscounter ++ ;
if( poscounter == 30 )
{
poscounter = 0 ;
posind ++ ;
if( posind == 4 )
{
posind = 0 ;
}
}
// 位置番号を FLOAT4型の x に代入して頂点シェーダー FLOAT4型定数0番にセット
f4.x = ( float )posind ;
f4.y = 0 ;
f4.z = 0 ;
f4.w = 0 ;
SetVSConstF( 0, f4 ) ;
// 使用する頂点シェーダーのセット
SetUseVertexShader( vshandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// シェーダーを使用した2ポリゴンの描画
DrawPolygon3DToShader( Vertex, 2 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 使用したfloat4型定数10〜13番の設定を無効化する
ResetVSConstF( 10, 4 ) ;
// 使用したint4型定数0番の設定を無効化する
ResetVSConstI( 0, 1 ) ;
// 読み込んだ頂点シェーダーの削除
DeleteShader( vshandle ) ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
頂点シェーダーのプログラム( コンパイルして SetVSConstFArrayTestVS.vso になる前のHLSLソース )
// 頂点シェーダーの入力
struct VS_INPUT
{
float4 Position : POSITION ; // 座標( VERTEX3DSHADER構造体の pos の値 )
float3 Normal : NORMAL0 ; // 法線( VERTEX3DSHADER構造体の norm の値 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー( VERTEX3DSHADER構造体の dif の値 )
float4 SpecularColor : COLOR1 ; // スペキュラカラー( VERTEX3DSHADER構造体の spc の値 )
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標0( VERTEX3DSHADER構造体の u, v の値 )
float2 TextureCoord1 : TEXCOORD1 ; // テクスチャ座標1( VERTEX3DSHADER構造体の su, sv の値 )
} ;
// 頂点シェーダーの出力
struct VS_OUTPUT
{
float4 ProjectionPosition : POSITION ; // 座標( 射影空間 )
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// C++ 側で設定する定数の定義
float4x4 cfViewMatrix : register( c6 ) ; // ワールド座標をビュー座標に変換する行列の転置行列
float4x4 cfProjectionMatrix : register( c2 ) ; // ビュー座標を射影座標に変換する行列の転置行列
// 座標値の配列
float4 cfDrawPosition[ 4 ] : register( c10 ) ;
// 座標値配列のインデックス
int4 ciPositionIndex : register( c0 ) ;
// main関数
VS_OUTPUT main( VS_INPUT VSInput )
{
VS_OUTPUT VSOutput ;
float4 lWorldPosition ;
float4 lViewPosition ;
// 入力座標に座標インデックスで決定する座標を加算する
lWorldPosition = VSInput.Position + cfDrawPosition[ ciPositionIndex.x ] ;
// 頂点座標をビュー空間の座標に変換する
lViewPosition = mul( lWorldPosition, cfViewMatrix ) ;
// ビュー空間の座標を射影空間の座標に変換する
VSOutput.ProjectionPosition = mul( lViewPosition, cfProjectionMatrix ) ;
// テクスチャ座標はそのまま代入
VSOutput.TextureCoord0 = VSInput.TextureCoord0;
// 頂点カラーはそのまま代入
VSOutput.DiffuseColor = VSInput.DiffuseColor ;
// 関数の戻り値がピクセルシェーダーに渡される
return VSOutput ;
}
ピクセルシェーダーのプログラム( コンパイルして SetVSConstFArrayTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ; // ディフューズカラー
float2 TextureCoord0 : TEXCOORD0 ; // テクスチャ座標
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 DrawColor : COLOR0 ; // 描画カラー
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力する色はテクスチャの色とディフューズカラーを乗算したもの
PSOutput.DrawColor = lTextureColor * PSInput.DiffuseColor ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル 効果的な使い方はしていませんが、LoadVertexShader や SetVSConstFMtxのサンプルで使用しています。 | ||||||||||||||
| ||||||||||||||
|
サンプル Tex1.bmp を貼り付けたポリゴン2枚を SetPSConstF で設定した r, g, b の値を乗算して描画します。 因みに x, y, z, w は r, g, b, a に対応しています。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int texhandle, pshandle ;
VERTEX2DSHADER Vert[ 6 ] ;
int r, g, b ;
int radd, gadd, badd ;
FLOAT4 f4 ;
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// テクスチャを読み込む
texhandle = LoadGraph( "Tex1.bmp" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "SetPSConstFTestPS.pso" ) ;
// 2ポリゴン分の頂点のデータをセットアップ
Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ;
Vert[ 0 ].rhw = 1.0f ;
Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 0 ].u = 0.0f ;
Vert[ 0 ].v = 0.0f ;
Vert[ 0 ].su = 0.0f ;
Vert[ 0 ].sv = 0.0f ;
Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 1 ].rhw = 1.0f ;
Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 1 ].u = 1.0f ;
Vert[ 1 ].v = 0.0f ;
Vert[ 1 ].su = 1.0f ;
Vert[ 1 ].sv = 0.0f ;
Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 2 ].rhw = 1.0f ;
Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 2 ].u = 0.0f ;
Vert[ 2 ].v = 1.0f ;
Vert[ 2 ].su = 0.0f ;
Vert[ 2 ].sv = 1.0f ;
Vert[ 3 ].pos = VGet( 256.0f, 256.0f, 0.0f ) ;
Vert[ 3 ].rhw = 1.0f ;
Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 3 ].u = 1.0f ;
Vert[ 3 ].v = 1.0f ;
Vert[ 3 ].su = 1.0f ;
Vert[ 3 ].sv = 1.0f ;
Vert[ 4 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 4 ].rhw = 1.0f ;
Vert[ 4 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 4 ].u = 0.0f ;
Vert[ 4 ].v = 1.0f ;
Vert[ 4 ].su = 0.0f ;
Vert[ 4 ].sv = 1.0f ;
Vert[ 5 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 5 ].rhw = 1.0f ;
Vert[ 5 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 5 ].u = 1.0f ;
Vert[ 5 ].v = 0.0f ;
Vert[ 5 ].su = 1.0f ;
Vert[ 5 ].sv = 0.0f ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// r, g, b の値を変化させる準備
r = 0 ;
g = 128 ;
b = 255 ;
radd = 10 ;
gadd = 7 ;
badd = 3 ;
// ESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// r, g, b の値を変化させる
r += radd ;
if( r >= 255 )
{
r = 255 ;
radd = -radd ;
}
else
if( r <= 0 )
{
r = 0 ;
radd = -radd ;
}
g += gadd ;
if( g >= 255 )
{
g = 255 ;
gadd = -gadd ;
}
else
if( g <= 0 )
{
g = 0 ;
gadd = -gadd ;
}
b += badd ;
if( b >= 255 )
{
b = 255 ;
badd = -badd ;
}
else
if( b <= 0 )
{
b = 0 ;
badd = -badd ;
}
// r, g, b の値をピクセルシェーダーの FLOAT4型定数0番にセット
// 定数にするときは値を 0.0f 〜 1.0f にする
f4.x = r / 255.0f ;
f4.y = g / 255.0f ;
f4.z = b / 255.0f ;
f4.w = 1.0f ;
SetPSConstF( 0, f4 ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// シェーダーを使用した2Dの2ポリゴンの描画
DrawPolygon2DToShader( Vert, 2 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// 使用した定数を無効化する
ResetPSConstF( 0, 1 ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
ピクセルシェーダーのプログラム( コンパイルして SetPSConstFTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ;
float4 SpecularColor : COLOR1 ;
float2 TextureCoord0 : TEXCOORD0 ;
float2 TextureCoord1 : TEXCOORD1 ;
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Output : COLOR0 ;
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// テクスチャの色に乗算する値
float4 cfMultiplyColor : register( c0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力する色はテクスチャの色と定数を乗算したもの
PSOutput.Output = lTextureColor * cfMultiplyColor ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル ありません。 | ||||||||||||||
| ||||||||||||||
|
サンプル ありません。 | ||||||||||||||
| ||||||||||||||
|
サンプル 効果的な使い方はしていませんが、LoadVertexShader や SetPSConstFのサンプルで使用しています。 | ||||||||||||||
| ||||||||||||||
|
サンプル Tex1.bmp を二つの描画先に描画します、片方は画像の赤成分だけを描画して、もう片方には画像の緑成分だけを描画します。 そしてその結果を画面に表示します。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int texhandle, pshandle ;
int screen0, screen1 ;
VERTEX2DSHADER Vert[ 6 ] ;
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// テクスチャを読み込む
texhandle = LoadGraph( "Tex1.bmp" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "SetRenderTargetTestPS.pso" ) ;
// 256×256の描画可能なグラフィックハンドルを二つ作成する
screen0 = MakeScreen( 256, 256 ) ;
screen1 = MakeScreen( 256, 256 ) ;
// 2ポリゴン分の頂点のデータをセットアップ
Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ;
Vert[ 0 ].rhw = 1.0f ;
Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 0 ].u = 0.0f ;
Vert[ 0 ].v = 0.0f ;
Vert[ 0 ].su = 0.0f ;
Vert[ 0 ].sv = 0.0f ;
Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 1 ].rhw = 1.0f ;
Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 1 ].u = 1.0f ;
Vert[ 1 ].v = 0.0f ;
Vert[ 1 ].su = 0.0f ;
Vert[ 1 ].sv = 0.0f ;
Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 2 ].rhw = 1.0f ;
Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 2 ].u = 0.0f ;
Vert[ 2 ].v = 1.0f ;
Vert[ 2 ].su = 0.0f ;
Vert[ 2 ].sv = 0.0f ;
Vert[ 3 ].pos = VGet( 256.0f, 256.0f, 0.0f ) ;
Vert[ 3 ].rhw = 1.0f ;
Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 3 ].u = 1.0f ;
Vert[ 3 ].v = 1.0f ;
Vert[ 3 ].su = 0.0f ;
Vert[ 3 ].sv = 0.0f ;
Vert[ 4 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 4 ].rhw = 1.0f ;
Vert[ 4 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 4 ].u = 0.0f ;
Vert[ 4 ].v = 1.0f ;
Vert[ 4 ].su = 0.0f ;
Vert[ 4 ].sv = 0.0f ;
Vert[ 5 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 5 ].rhw = 1.0f ;
Vert[ 5 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 5 ].u = 1.0f ;
Vert[ 5 ].v = 0.0f ;
Vert[ 5 ].su = 0.0f ;
Vert[ 5 ].sv = 0.0f ;
// 描画先0を描画可能画像の一つ目に設定
SetRenderTargetToShader( 0, screen0 ) ;
// 描画先1を描画可能画像の二つ目に設定
SetRenderTargetToShader( 1, screen1 ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// シェーダーを使用した2Dの2ポリゴンの描画
DrawPolygon2DToShader( Vert, 2 ) ;
// 描画先を表画面に変更
SetDrawScreen( DX_SCREEN_FRONT ) ;
// 描画先1の設定をリセット
SetRenderTargetToShader( 1, -1 ) ;
// 二つの描画可能画像を並べて描画
DrawGraph( 0, 0, screen0, FALSE ) ;
DrawGraph( 256, 0, screen1, FALSE ) ;
// キー入力待ち
WaitKey() ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
ピクセルシェーダーのプログラム( コンパイルして SetRenderTargetTestPS.pso になる前のHLSLソース )
// ピクセルシェーダーの入力
struct PS_INPUT
{
float4 DiffuseColor : COLOR0 ;
float4 SpecularColor : COLOR1 ;
float2 TextureCoord0 : TEXCOORD0 ;
float2 TextureCoord1 : TEXCOORD1 ;
} ;
// ピクセルシェーダーの出力
struct PS_OUTPUT
{
float4 Output0 : COLOR0 ;
float4 Output1 : COLOR1 ;
} ;
// C++ 側で設定する定数の定義
// 描画するテクスチャ
sampler DiffuseMapTexture : register( s0 ) ;
// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
PS_OUTPUT PSOutput ;
float4 lTextureColor ;
// テクスチャーの色を取得
lTextureColor = tex2D( DiffuseMapTexture, PSInput.TextureCoord0 ) ;
// 出力先0には赤成分だけ出力
PSOutput.Output0.r = lTextureColor.r ;
PSOutput.Output0.g = 0.0f ;
PSOutput.Output0.b = 0.0f ;
PSOutput.Output0.a = 1.0f ;
// 出力先1には緑成分だけ出力
PSOutput.Output1.r = 0.0f ;
PSOutput.Output1.g = lTextureColor.g ;
PSOutput.Output1.b = 0.0f ;
PSOutput.Output1.a = 1.0f ;
// 関数の戻り値がラスタライザに渡される
return PSOutput ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader などのシェーダー関係関数のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader などのシェーダー関係関数のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader などのシェーダー関係関数のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadPixelShader や SetPSConstF のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader や SetVSConstFMtx のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル LoadPixelShader のサンプルプログラムのC++の部分のみを DrawPolygonIndexed2DToShader を使用するようにしたプログラムです。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int texhandle, pshandle ;
VERTEX2DSHADER Vert[ 4 ] ;
unsigned short Index[ 6 ] ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// テクスチャを読み込む
texhandle = LoadGraph( "Tex1.bmp" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "PixelShaderTestPS.pso" ) ;
// 2ポリゴン分の頂点のデータをセットアップ
Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ;
Vert[ 0 ].rhw = 1.0f ;
Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 0 ].u = 0.0f ;
Vert[ 0 ].v = 0.0f ;
Vert[ 0 ].su = 0.0f ;
Vert[ 0 ].sv = 0.0f ;
Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ;
Vert[ 1 ].rhw = 1.0f ;
Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 1 ].u = 1.0f ;
Vert[ 1 ].v = 0.0f ;
Vert[ 1 ].su = 1.0f ;
Vert[ 1 ].sv = 0.0f ;
Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ;
Vert[ 2 ].rhw = 1.0f ;
Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 2 ].u = 0.0f ;
Vert[ 2 ].v = 1.0f ;
Vert[ 2 ].su = 0.0f ;
Vert[ 2 ].sv = 1.0f ;
Vert[ 3 ].pos = VGet( 256.0f, 256.0f, 0.0f ) ;
Vert[ 3 ].rhw = 1.0f ;
Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vert[ 3 ].u = 1.0f ;
Vert[ 3 ].v = 1.0f ;
Vert[ 3 ].su = 1.0f ;
Vert[ 3 ].sv = 1.0f ;
// 2ポリゴン分の頂点番号配列のセットアップ
Index[ 0 ] = 0 ;
Index[ 1 ] = 1 ;
Index[ 2 ] = 2 ;
Index[ 3 ] = 2 ;
Index[ 4 ] = 1 ;
Index[ 5 ] = 3 ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// シェーダーを使用した2Dの2ポリゴンの描画
DrawPolygonIndexed2DToShader( Vert, 4, Index, 2 ) ;
// キー入力待ち
WaitKey() ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル LoadVertexShader のサンプルプログラムのC++の部分のみを DrawPolygonIndexed3DToShader を使用するようにしたプログラムです。 C++のプログラム
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3DSHADER Vertex[ 4 ] ;
unsigned short Index[ 6 ] ;
int vshandle ;
int pshandle ;
int texhandle ;
int x ;
int xadd ;
float color ;
float coloradd ;
FLOAT4 f4 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 2ポリゴン分の頂点のデータをセットアップ
Vertex[ 0 ].pos = VGet( 220.0f, 340.0f, 0.0f ) ;
Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 0 ].dif = GetColorU8( 255, 0,255,255 ) ;
Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 0 ].u = 0.0f ;
Vertex[ 0 ].v = 0.0f ;
Vertex[ 0 ].su = 0.0f ;
Vertex[ 0 ].sv = 0.0f ;
Vertex[ 1 ].pos = VGet( 420.0f, 340.0f, 0.0f ) ;
Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 1 ].dif = GetColorU8( 0, 0,255,255 ) ;
Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 1 ].u = 1.0f ;
Vertex[ 1 ].v = 0.0f ;
Vertex[ 1 ].su = 0.0f ;
Vertex[ 1 ].sv = 0.0f ;
Vertex[ 2 ].pos = VGet( 220.0f, 140.0f, 0.0f ) ;
Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 2 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 2 ].u = 0.0f ;
Vertex[ 2 ].v = 1.0f ;
Vertex[ 2 ].su = 0.0f ;
Vertex[ 2 ].sv = 0.0f ;
Vertex[ 3 ].pos = VGet( 420.0f, 140.0f, 0.0f ) ;
Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ 3 ].dif = GetColorU8( 255,255, 0,255 ) ;
Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 3 ].u = 1.0f ;
Vertex[ 3 ].v = 1.0f ;
Vertex[ 3 ].su = 0.0f ;
Vertex[ 3 ].sv = 0.0f ;
// 2ポリゴン分の頂点番号配列をセットアップ
Index[ 0 ] = 0 ;
Index[ 1 ] = 1 ;
Index[ 2 ] = 2 ;
Index[ 3 ] = 2 ;
Index[ 4 ] = 1 ;
Index[ 5 ] = 3 ;
// 頂点シェーダーを読み込む
vshandle = LoadVertexShader( "VertexShaderTestVS.vso" ) ;
// ピクセルシェーダーを読み込む
pshandle = LoadPixelShader( "VertexShaderTestPS.pso" ) ;
// 描画に使用する画像の読み込み
texhandle = LoadGraph( "Tex1.bmp" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 表示座標を移動する処理の初期化
x = 0 ;
xadd = 8 ;
// 色を変化させる処理の初期化
color = 0.0f ;
coloradd = 1.0f / 60.0f ;
// ESCキーが押されるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// 座標を移動させる
x += xadd ;
if( x > 200 || x < -200 )
{
xadd = -xadd ;
}
// 色の値を変化させる
color += coloradd ;
if( color <= 0.0f || color >= 1.0f )
{
coloradd = -coloradd ;
}
// 座標値を頂点シェーダー float4型定数0番にセット
f4.x = ( float )x ;
f4.y = 0.0f ;
f4.z = 0.0f ;
f4.w = 0.0f ;
SetVSConstF( 0, f4 ) ;
// 色の値をピクセルシェーダー float4型定数0番にセット
f4.x = color ;
f4.y = color ;
f4.z = color ;
f4.w = 1.0f ;
SetPSConstF( 0, f4 ) ;
// 使用する頂点シェーダーのセット
SetUseVertexShader( vshandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
// 使用するテクスチャを0番にセット
SetUseTextureToShader( 0, texhandle ) ;
// シェーダーを使用した2ポリゴンの描画
DrawPolygonIndexed3DToShader( Vertex, 4, Index, 2 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 使用した頂点シェーダーの float4型定数の設定を無効化する
ResetVSConstF( 0, 2 ) ;
// 使用したピクセルシェーダーの float4型定数の設定を無効化する
ResetPSConstF( 0, 1 ) ;
// 読み込んだ頂点シェーダーの削除
DeleteShader( vshandle ) ;
// 読み込んだピクセルシェーダーの削除
DeleteShader( pshandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| シャドウマップ関係関数 | ||||||||||||||
| ||||||||||||||
|
サンプル 板ポリゴンにキャラクターモデルの影を描画します。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int StageModelHandle ;
int CharaModelHandle ;
int ShadowMapHandle ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "Plane.mqo" ) ;
// シャドウマップハンドルの作成
ShadowMapHandle = MakeShadowMap( 1024, 1024 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 800.0f, -800.0f ), VGet( 0.000f, 500.000f, 0.000f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 40.000f, 2000.000f );
// ライトの方向を設定
SetLightDirection( VGet( 0.5f, -0.5f, 0.5f ) );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( ShadowMapHandle, VGet( 0.5f, -0.5f, 0.5f ) ) ;
// シャドウマップに描画する範囲を設定
SetShadowMapDrawArea( ShadowMapHandle, VGet( -1000.0f, -1.0f, -1000.0f ), VGet( 1000.0f, 1000.0f, 1000.0f ) ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// シャドウマップへの描画の準備
ShadowMap_DrawSetup( ShadowMapHandle ) ;
// シャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// シャドウマップへキャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// シャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画に使用するシャドウマップを設定
SetUseShadowMap( 0, ShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( ShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MakeShadowMap のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル 板ポリゴンにキャラクターモデルの影を描画して、その影の角度( とライトの方向 )を回転させます。
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int StageModelHandle ;
int CharaModelHandle ;
int ShadowMapHandle ;
float Angle ;
VECTOR LightDirection ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "Plane.mqo" ) ;
// シャドウマップハンドルの作成
ShadowMapHandle = MakeShadowMap( 1024, 1024 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 800.0f, -800.0f ), VGet( 0.000f, 500.000f, 0.000f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 40.000f, 2000.000f );
// シャドウマップに描画する範囲を設定
SetShadowMapDrawArea( ShadowMapHandle, VGet( -1000.0f, -1.0f, -1000.0f ), VGet( 1000.0f, 1000.0f, 1000.0f ) ) ;
// ライトの角度を初期化
Angle = 0.0f ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// ライトの角度を変更
Angle += 0.0125f ;
if( Angle > DX_PI_F * 2.0f )
{
Angle -= DX_PI_F * 2.0f ;
}
// ライトの方向ベクトルの算出
LightDirection.x = sin( Angle ) ;
LightDirection.z = cos( Angle ) ;
LightDirection.y = -1.0f ;
// ライトの方向を設定
SetLightDirection( LightDirection );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( ShadowMapHandle, LightDirection ) ;
// シャドウマップへの描画の準備
ShadowMap_DrawSetup( ShadowMapHandle ) ;
// シャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// シャドウマップへキャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// シャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画に使用するシャドウマップを設定
SetUseShadowMap( 0, ShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( ShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル MakeShadowMap のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル MakeShadowMap のサンプルを参照してください。 | ||||||||||||||
| ||||||||||||||
|
サンプル 解説の例1のサンプルです。ステージモデル用のシャドウマップとキャラクターモデル用のシャドウマップを別々に用意して、 ステージモデル用のシャドウマップにはメインループに入る前に一度だけステージモデルを描画して、メインループ中では キャラクターモデル用のシャドウマップに対してのみ毎フレームキャラクターモデルを描画するようにしています。
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int StageModelHandle ;
int CharaModelHandle ;
int StageShadowMapHandle ;
int CharaShadowMapHandle ;
float Angle ;
VECTOR CharaPosition ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "SimplePillarStage.mqo" ) ;
// ステージモデル用のシャドウマップハンドルの作成
StageShadowMapHandle = MakeShadowMap( 2048, 2048 ) ;
// キャラクターモデル用のシャドウマップハンドルの作成
CharaShadowMapHandle = MakeShadowMap( 2048, 2048 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 1500.0f, -1500.0f ), VGet( 0.0f, 800.0f, -800.0f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 160.000f, 80000.000f );
// シャドウマップに描画する範囲を設定
SetShadowMapDrawArea( StageShadowMapHandle, VGet( -4000.0f, -1.0f, -4000.0f ), VGet( 4000.0f, 4000.0f, 4000.0f ) ) ;
SetShadowMapDrawArea( CharaShadowMapHandle, VGet( -4000.0f, -1.0f, -4000.0f ), VGet( 4000.0f, 4000.0f, 4000.0f ) ) ;
// ライトの方向を設定
SetLightDirection( VGet( 0.5f, -0.5f, 0.5f ) );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( StageShadowMapHandle, VGet( 0.5f, -0.5f, 0.5f ) ) ;
SetShadowMapLightDirection( CharaShadowMapHandle, VGet( 0.5f, -0.5f, 0.5f ) ) ;
// ステージモデル用のシャドウマップへの描画の準備
ShadowMap_DrawSetup( StageShadowMapHandle ) ;
// ステージモデル用のシャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// ステージモデル用のシャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// キャラクターの位置となる角度を初期化
Angle = 0.0f ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// キャラクターの位置となる角度を変更
Angle += 0.0125f ;
if( Angle > DX_PI_F * 2.0f )
{
Angle -= DX_PI_F * 2.0f ;
}
// キャラクターの座標を算出
CharaPosition.x = sin( Angle ) * 1000.0f ;
CharaPosition.z = cos( Angle ) * 1000.0f ;
CharaPosition.y = 0.0f ;
// キャラクターモデルの座標を変更
MV1SetPosition( CharaModelHandle, CharaPosition ) ;
// キャラクターモデル用のシャドウマップへの描画の準備
ShadowMap_DrawSetup( CharaShadowMapHandle ) ;
// キャラクターモデル用のシャドウマップへキャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// キャラクターモデル用のシャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画にキャラクターモデル用のシャドウマップと
// ステージモデル用のシャドウマップのどちらも使用する
SetUseShadowMap( 0, StageShadowMapHandle ) ;
SetUseShadowMap( 1, CharaShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
SetUseShadowMap( 1, -1 ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( StageShadowMapHandle ) ;
DeleteShadowMap( CharaShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル シャドウマップに描画する範囲を変更した結果を確認するためのサンプルです。上下キーで描画の範囲を変更できます。
#include "DxLib.h"
#define CHARA_POS_SPACE (1500.0f)
#define CHARA_NUM (4)
#define CHARA_POS_DISTANCE ( ( CHARA_NUM - 1 ) * CHARA_POS_SPACE )
int StageModelHandle ;
int CharaModelHandle ;
int ShadowMapHandle ;
// キャラクターを描画する
void CharaDraw( void )
{
int i ;
int j ;
VECTOR Position ;
// キャラクターを16体描画
for( i = 0 ; i < CHARA_NUM ; i ++ )
{
for( j = 0 ; j < CHARA_NUM ; j ++ )
{
// 描画位置を設定
Position.x = -CHARA_POS_DISTANCE / 2.0f + CHARA_POS_SPACE * j ;
Position.y = 0.0f ;
Position.z = -CHARA_POS_DISTANCE / 2.0f + CHARA_POS_SPACE * i ;
MV1SetPosition( CharaModelHandle, Position ) ;
// 3Dモデルを描画
MV1DrawModel( CharaModelHandle ) ;
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
float DrawAreaSize ;
VECTOR DrawAreaMinPos ;
VECTOR DrawAreaMaxPos ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "Plane.mqo" ) ;
// シャドウマップハンドルの作成
ShadowMapHandle = MakeShadowMap( 1024, 1024 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 3600.0f, -3400.0f ), VGet( 0.000f, 500.000f, -500.000f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 200.000f, 10000.000f );
// ライトの方向を設定
SetLightDirection( VGet( 0.5f, -0.5f, 0.5f ) );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( ShadowMapHandle, VGet( 0.5f, -0.5f, 0.5f ) ) ;
// 描画するサイズを初期化
DrawAreaSize = 1000.0f ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 上下キーで描画するサイズを変更
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
DrawAreaSize += 10.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
DrawAreaSize -= 10.0f ;
if( DrawAreaSize < 1.0f )
{
DrawAreaSize = 1.0f ;
}
}
// シャドウマップに描画する範囲を設定
DrawAreaMinPos = VGet( -DrawAreaSize, -1.0f, -DrawAreaSize ) ;
DrawAreaMaxPos = VGet( DrawAreaSize, 1000.0f, DrawAreaSize ) ;
SetShadowMapDrawArea( ShadowMapHandle, DrawAreaMinPos, DrawAreaMaxPos ) ;
// シャドウマップへの描画の準備
ShadowMap_DrawSetup( ShadowMapHandle ) ;
// シャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// シャドウマップへキャラクターモデルの描画
CharaDraw() ;
// シャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画に使用するシャドウマップを設定
SetUseShadowMap( 0, ShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
CharaDraw() ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
// 画面に現在のサイズと範囲を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "AreaSize:%.1f", DrawAreaSize ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "MinPos( %.1f, %.1f, %.1f )",
DrawAreaMinPos.x, DrawAreaMinPos.y, DrawAreaMinPos.z ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "MaxPos( %.1f, %.1f, %.1f )",
DrawAreaMaxPos.x, DrawAreaMaxPos.y, DrawAreaMaxPos.z ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( ShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル シャドウマップを使用して影を表現するサンプルに、上下キーで深度判定の補正値を変更できるようにしたもの。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int StageModelHandle ;
int CharaModelHandle ;
int ShadowMapHandle ;
float Adjust ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "Plane.mqo" ) ;
// シャドウマップハンドルの作成
ShadowMapHandle = MakeShadowMap( 1024, 1024 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 800.0f, -800.0f ), VGet( 0.000f, 500.000f, 0.000f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 40.000f, 2000.000f );
// ライトの方向を設定
SetLightDirection( VGet( 0.5f, -0.5f, 0.5f ) );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( ShadowMapHandle, VGet( 0.5f, -0.5f, 0.5f ) ) ;
// シャドウマップに描画する範囲を設定
SetShadowMapDrawArea( ShadowMapHandle, VGet( -1000.0f, -1.0f, -1000.0f ), VGet( 1000.0f, 1000.0f, 1000.0f ) ) ;
// 補正値を初期化
Adjust = 0.002f ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 上下キーで補正値を変更
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
Adjust += 0.001f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
Adjust -= 0.001f ;
}
SetShadowMapAdjustDepth( ShadowMapHandle, Adjust ) ;
// シャドウマップへの描画の準備
ShadowMap_DrawSetup( ShadowMapHandle ) ;
// シャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// シャドウマップへキャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// シャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画に使用するシャドウマップを設定
SetUseShadowMap( 0, ShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
// 現在の補正値を画面に描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Adjust Depth:%f", Adjust ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( ShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
| ||||||||||||||
|
サンプル SetShadowMapLightDirection のサンプルに TestDrawShadowMap を使用して画面左上にシャドウマップのテスト描画を加えたもの。
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int StageModelHandle ;
int CharaModelHandle ;
int ShadowMapHandle ;
float Angle ;
VECTOR LightDirection ;
// ウインドウモードで起動する
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら終了
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// キャラクターモデルの読み込み
CharaModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ステージモデルの読み込み
StageModelHandle = MV1LoadModel( "Plane.mqo" ) ;
// シャドウマップハンドルの作成
ShadowMapHandle = MakeShadowMap( 1024, 1024 ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 800.0f, -800.0f ), VGet( 0.000f, 500.000f, 0.000f ) );
// 描画する奥行き方向の範囲を設定
SetCameraNearFar( 40.000f, 2000.000f );
// シャドウマップに描画する範囲を設定
SetShadowMapDrawArea( ShadowMapHandle, VGet( -1000.0f, -1.0f, -1000.0f ), VGet( 1000.0f, 1000.0f, 1000.0f ) ) ;
// ライトの角度を初期化
Angle = 0.0f ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// ライトの角度を変更
Angle += 0.0125f ;
if( Angle > DX_PI_F * 2.0f )
{
Angle -= DX_PI_F * 2.0f ;
}
// ライトの方向ベクトルの算出
LightDirection.x = sin( Angle ) ;
LightDirection.z = cos( Angle ) ;
LightDirection.y = -1.0f ;
// ライトの方向を設定
SetLightDirection( LightDirection );
// シャドウマップが想定するライトの方向もセット
SetShadowMapLightDirection( ShadowMapHandle, LightDirection ) ;
// シャドウマップへの描画の準備
ShadowMap_DrawSetup( ShadowMapHandle ) ;
// シャドウマップへステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// シャドウマップへキャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// シャドウマップへの描画を終了
ShadowMap_DrawEnd() ;
// 描画に使用するシャドウマップを設定
SetUseShadowMap( 0, ShadowMapHandle ) ;
// ステージモデルの描画
MV1DrawModel( StageModelHandle ) ;
// キャラクターモデルの描画
MV1DrawModel( CharaModelHandle ) ;
// 描画に使用するシャドウマップの設定を解除
SetUseShadowMap( 0, -1 ) ;
// 画面左上にシャドウマップをテスト描画
TestDrawShadowMap( ShadowMapHandle, 0, 0, 320, 240 ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// シャドウマップの削除
DeleteShadowMap( ShadowMapHandle ) ;
// ステージモデルの削除
MV1DeleteModel( StageModelHandle ) ;
// キャラクターモデルの削除
MV1DeleteModel( CharaModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
| ||||||||||||||
|
戻る | ||||||||||||||