#1
by Yggdra » 8年前
はじめまして、3Dに手を出して間もない者なのですが、カメラの位置設定で困っております。
対戦格闘ゲームのようなものを作ろうとしているのですが、
敵を軸にプレイヤーに円運動をさせた場合にカメラをプレイヤーの背面にもっていきたいのです。
あれこれ調査はしてみたのですが、独学では厳しいと思い、皆様の力をお借りしたいと思います。
下記コードの74行目カメラの位置設定箇所です。
コード:
#include #include <math.h>
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
int playerModel;
int enemyModel;
VECTOR playerPos;
VECTOR enemyPos;
VECTOR camPos;
VECTOR camTgt;
VECTOR subVector;
int field;
float playerAngle;
float enemyAngle;
// 初期化
if(DxLib_Init() == 0) {
// 異常終了
return 0;
}
// 3Dモデルの読み込み
playerModel = MV1LoadModel("XXX.pmd");
enemyModel = MV1CreateCloneModel(playerModel);
field = MV1LoadModel("XXX.mqo");
// 奥行0.1~10000までをカメラの描画範囲とする
SetCameraNearFar(0.1f, 10000.0f);
// 3Dモデルの座標を初期化
playerPos = VGet(0.0f, 0.0f, -30.0f);
enemyPos = VGet(0.0f, 0.0f, 30.0f);
camPos = VGet(playerPos.x + 5.0f, 25.0f, playerPos.z - 30.0f);
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
// 指定位置にモデルを配置
MV1SetPosition(playerModel, playerPos);
MV1SetPosition(enemyModel, enemyPos);
// 3Dモデル2から3Dモデル1に向かうベクトルを算出
subVector = VSub(enemyPos, playerPos);
// atan2 を使用して角度を取得
playerAngle = atan2f(subVector.x, subVector.z);
// atan2 で取得した角度に3Dモデルを正面に向かせるための補正値( DX_PI_F )を足した値を3Dモデルの Y軸回転値として設定
MV1SetRotationXYZ(playerModel, VGet(0.0f, playerAngle + DX_PI_F, 0.0f));
// 3Dモデル1から3Dモデル2に向かうベクトルを算出
subVector = VSub(playerPos, enemyPos);
// atan2 を使用して角度を取得
enemyAngle = atan2f(subVector.x, subVector.z);
// atan2 で取得した角度に3Dモデルを正面に向かせるための補正値( DX_PI_F )を足した値を3Dモデルの Y軸回転値として設定
MV1SetRotationXYZ(enemy->Model, VGet(0.0f, enemyAngle + DX_PI_F, 0.0f));
if(CheckHitKey(KEY_INPUT_LEFT) > 0){
// 敵を軸に左回転
playerPos.x += cosf(-(MV1GetRotationXYZ(playerModel).y)) * 1.0f;
playerPos.z += sinf(-(MV1GetRotationXYZ(playerModel).y)) * 1.0f;
}
if(CheckHitKey(KEY_INPUT_RIGHT) > 0){
// 敵を軸に右回転
playerPos.x += cosf(-(MV1GetRotationXYZ(playerModel).y)) * -1.0f;
playerPos.z += sinf(-(MV1GetRotationXYZ(playerModel).y)) * -1.0f;
}
if(CheckHitKey(KEY_INPUT_UP)){
// 前進
playerPos.x += sinf(MV1GetRotationXYZ(playerModel).y) * -1.0f;
playerPos.z += cosf(MV1GetRotationXYZ(playerModel).y) * -1.0f;
}
if(CheckHitKey(KEY_INPUT_DOWN)){
// 後退
playerPos.x += sinf(MV1GetRotationXYZ(playerModel).y) * 1.0f;
playerPos.z += cosf(MV1GetRotationXYZ(playerModel).y) * 1.0f;
}
// カメラ追従
camTgt = enemyPos;
camPos = VGet(playerPos.x + 5.0f * cosf(MV1GetRotationXYZ(playerModel).y), 25.0f, playerPos.z -30.0f * sinf(MV1GetRotationXYZ(playerModel).y));
SetCameraPositionAndTarget_UpVecY(camPos, camTgt);
// 3Dモデルの描画
MV1DrawModel(playerModel);
MV1DrawModel(enemyModel);
MV1DrawModel(field);
}
// DXライブラリ終了処理
DxLib_End();
// 終了
return 0;
}
// End Of File
はじめまして、3Dに手を出して間もない者なのですが、カメラの位置設定で困っております。
対戦格闘ゲームのようなものを作ろうとしているのですが、
敵を軸にプレイヤーに円運動をさせた場合にカメラをプレイヤーの背面にもっていきたいのです。
あれこれ調査はしてみたのですが、独学では厳しいと思い、皆様の力をお借りしたいと思います。
下記コードの74行目カメラの位置設定箇所です。
[code]#include #include <math.h>
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
int playerModel;
int enemyModel;
VECTOR playerPos;
VECTOR enemyPos;
VECTOR camPos;
VECTOR camTgt;
VECTOR subVector;
int field;
float playerAngle;
float enemyAngle;
// 初期化
if(DxLib_Init() == 0) {
// 異常終了
return 0;
}
// 3Dモデルの読み込み
playerModel = MV1LoadModel("XXX.pmd");
enemyModel = MV1CreateCloneModel(playerModel);
field = MV1LoadModel("XXX.mqo");
// 奥行0.1~10000までをカメラの描画範囲とする
SetCameraNearFar(0.1f, 10000.0f);
// 3Dモデルの座標を初期化
playerPos = VGet(0.0f, 0.0f, -30.0f);
enemyPos = VGet(0.0f, 0.0f, 30.0f);
camPos = VGet(playerPos.x + 5.0f, 25.0f, playerPos.z - 30.0f);
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
// 指定位置にモデルを配置
MV1SetPosition(playerModel, playerPos);
MV1SetPosition(enemyModel, enemyPos);
// 3Dモデル2から3Dモデル1に向かうベクトルを算出
subVector = VSub(enemyPos, playerPos);
// atan2 を使用して角度を取得
playerAngle = atan2f(subVector.x, subVector.z);
// atan2 で取得した角度に3Dモデルを正面に向かせるための補正値( DX_PI_F )を足した値を3Dモデルの Y軸回転値として設定
MV1SetRotationXYZ(playerModel, VGet(0.0f, playerAngle + DX_PI_F, 0.0f));
// 3Dモデル1から3Dモデル2に向かうベクトルを算出
subVector = VSub(playerPos, enemyPos);
// atan2 を使用して角度を取得
enemyAngle = atan2f(subVector.x, subVector.z);
// atan2 で取得した角度に3Dモデルを正面に向かせるための補正値( DX_PI_F )を足した値を3Dモデルの Y軸回転値として設定
MV1SetRotationXYZ(enemy->Model, VGet(0.0f, enemyAngle + DX_PI_F, 0.0f));
if(CheckHitKey(KEY_INPUT_LEFT) > 0){
// 敵を軸に左回転
playerPos.x += cosf(-(MV1GetRotationXYZ(playerModel).y)) * 1.0f;
playerPos.z += sinf(-(MV1GetRotationXYZ(playerModel).y)) * 1.0f;
}
if(CheckHitKey(KEY_INPUT_RIGHT) > 0){
// 敵を軸に右回転
playerPos.x += cosf(-(MV1GetRotationXYZ(playerModel).y)) * -1.0f;
playerPos.z += sinf(-(MV1GetRotationXYZ(playerModel).y)) * -1.0f;
}
if(CheckHitKey(KEY_INPUT_UP)){
// 前進
playerPos.x += sinf(MV1GetRotationXYZ(playerModel).y) * -1.0f;
playerPos.z += cosf(MV1GetRotationXYZ(playerModel).y) * -1.0f;
}
if(CheckHitKey(KEY_INPUT_DOWN)){
// 後退
playerPos.x += sinf(MV1GetRotationXYZ(playerModel).y) * 1.0f;
playerPos.z += cosf(MV1GetRotationXYZ(playerModel).y) * 1.0f;
}
// カメラ追従
camTgt = enemyPos;
camPos = VGet(playerPos.x + 5.0f * cosf(MV1GetRotationXYZ(playerModel).y), 25.0f, playerPos.z -30.0f * sinf(MV1GetRotationXYZ(playerModel).y));
SetCameraPositionAndTarget_UpVecY(camPos, camTgt);
// 3Dモデルの描画
MV1DrawModel(playerModel);
MV1DrawModel(enemyModel);
MV1DrawModel(field);
}
// DXライブラリ終了処理
DxLib_End();
// 終了
return 0;
}
// End Of File
[/code]