Game::Game();コンストラクタの下の方の///内部の一行の関数ですがなぜ-1が返ってくるのでしょうか?(下のif文により確認済み)ログも出力しましたがどうやっても
-1です。公式リファレンスを確認しましたがなぜでしょうか? int型のanimation変数はgame.hファイルにて宣言しています。モデルを持ってる変数はmodelHandle
変数ですが画面に表示できているので関係ないと思われます。またモーションをモデルに適用して実装する処理を目指していますがそもそも間違えている場合はそれも指摘してほしいです。
よろしくお願いいたします。
公式リファレンス: h ttps://dxlib.xsrv.jp/function/dxfunc_3d_model_1.html#R4N1
#include "DxLib.h"
#include "Game.hpp"
#include "Input.hpp"
#include "Frame.hpp"
#include "Vector.hpp"
const char* filename = "Log.txt";
std::ofstream ofs(filename);
/*軸方向回転*/
Vector Game::get_axis(Vector camera, Vector target, Vector y) {
Vector rel = Vector(
camera.x - target.x,
camera.y - target.y,
camera.z - target.z
);
Vector n = Vector::cross(y, rel);
normalize(&n);//単位化
return n;
}
/*boolは正規化するかどうか?*/
/*面法線を返す関数 result から伸びてるv1,v2*/
VECTOR Game::Surface_normal(const VERTEX3D result, const VERTEX3D v1, const VERTEX3D v2)
{
VECTOR a, b;
VECTOR p; //p2, p3;//それぞれの面法線を入れる
// VECTOR result;//頂点法線
a.x = v1.pos.x - result.pos.x;
a.y = v1.pos.y - result.pos.y;
a.z = v1.pos.z - result.pos.z;
b.x = v2.pos.x - result.pos.x;
b.y = v2.pos.y - result.pos.y;
b.z = v2.pos.z - result.pos.z;
// ofs << " surface_normal() a: " << a.x << " , " << a.y << " , " << a.z << std::endl;
// ofs << " surface_normal() b: " << b.x << " , " << b.y << " , " << b.z << std::endl;
p = Vector::cross(a, b);//面法線
// ofs << " surface_normal() p: " << p.x << " , " << p.y << " , " << p.z << std::endl;
normalize(&p);//正規化
return p;
}
/*Shader版 法線設定関数*/
VERTEX3DSHADER Game::Surface_normal_shader(const VERTEX3DSHADER result, const VERTEX3DSHADER v1, const VERTEX3DSHADER v2)
{
VECTOR a, b;
VECTOR p; //p2, p3;//それぞれの面法線を入れる
// VECTOR result;//頂点法線
a.x = v1.pos.x - result.pos.x;
a.y = v1.pos.y - result.pos.y;
a.z = v1.pos.z - result.pos.z;
b.x = v2.pos.x - result.pos.x;
b.y = v2.pos.y - result.pos.y;
b.z = v2.pos.z - result.pos.z;
// ofs << " surface_normal() a: " << a.x << " , " << a.y << " , " << a.z << std::endl;
// ofs << " surface_normal() b: " << b.x << " , " << b.y << " , " << b.z << std::endl;
p = Vector::cross(a, b);//面法線
// ofs << " surface_normal() p: " << p.x << " , " << p.y << " , " << p.z << std::endl;
normalize(&p);//正規化
VERTEX3DSHADER shader;
shader.pos = p;
return shader;
}
//頂点法線を設定する
void Game::Vertex_Norm()
{
}
/*回転する座標、ラジアン、中心、軸*/
void Game::rotate(Vector* pos, const float ang, const Vector targetV, const Vector axis)
{
Quaternion P(0, Vector(pos->x - targetV.x, pos->y - targetV.y, pos->z - targetV.z));//回転させる点
Quaternion Q(cos(ang / 2), Vector(axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2)));
Quaternion R(cos(ang / 2), Vector(-axis.x * sin(ang / 2), -axis.y * sin(ang / 2), -axis.z * sin(ang / 2)));
Quaternion result = (R * P) * Q;//順番が大事
pos->x = result.v.x + targetV.x;
pos->y = result.v.y + targetV.y;
pos->z = result.v.z + targetV.z;
}
/*X軸回転 頂点を*/
Vector Game::Vertex_rotateX(Vector movePos, const float ang, const Vector* tergetPos)
{
const float oy = movePos.y - tergetPos->y;
const float oz = movePos.z - tergetPos->z;
movePos.y = oy * cos(ang) + oz * sin(ang);
movePos.z = -oy * sin(ang) + oz * cos(ang);
movePos.y += tergetPos->y;
movePos.z += tergetPos->z;
return movePos;
}
/*Y軸回転 頂点を*/
Vector Game::Vertex_rotateY(Vector movePos, const float ang, const Vector* tergetPos)
{
const float ox = movePos.x - tergetPos->x;
const float oz = movePos.z - tergetPos->z;
movePos.x = ox * cos(ang) + -oz * sin(ang);
movePos.z = ox * sin(ang) + oz * cos(ang);
movePos.x += tergetPos->x;
movePos.z += tergetPos->z;
return movePos;
}
/*操作切替 キー入力受付*/
void Game::change()
{
// DrawFormatString(0,32*3,GetColor(255,255,255),"chqnge();");
if (Input::keyboard(KEY_INPUT_F1) == 1)
{
mc = ModeChange::rotate;
}
else if (Input::keyboard(KEY_INPUT_F2) == 1)
{
mc = ModeChange::move;
}
else if (Input::keyboard(KEY_INPUT_F3) == 1)
{
mc = ModeChange::color_dif;
}
else if (Input::keyboard(KEY_INPUT_F4) == 1)
{
mc = ModeChange::color_spc;
}
}
/*単位化する関数*/
void Game::normalize(Vector* v) {
float magnitude = sqrt(Vector::dot(*v, *v));
v->x /= magnitude;
v->y /= magnitude;
v->z /= magnitude;
if (isnan(v->x) == true)
{
v->x = 0;
}
if (isnan(v->y) == true)
{
v->y = 0;
}
if (isnan(v->z) == true)
{
v->z = 0;
}
}
void Game::normalize(VECTOR* v) {
float magnitude = sqrt(Vector::dot(*v, *v));
// ofs<<"magnitude: "<<magnitude<<std::endl;
v->x /= magnitude;
v->y /= magnitude;
v->z /= magnitude;
if (isnan(v->x) == true)
{
v->x = 0;
}
if (isnan(v->y) == true)
{
v->y = 0;
}
if (isnan(v->z) == true)
{
v->z = 0;
}
}
/*コンストラクタ 初期化*/
Game::Game()
{
/*モデル座標*/
/*
model_pos.x = 32;
model_pos.y = 155;
model_pos.z = -661;
*/
model_pos.x = 0;
model_pos.y = -10;
model_pos.z = 0;
/*回転座標*/
model_rotate.x = 0;
model_rotate.y = 0;
model_rotate.z = 0;
modelHandle = MV1LoadModel("assets/resource/MMD/miku.pmx");
//modelHandle = MV1LoadModel("assets/resource/model.mv1");
if(modelHandle == -1)
{
ofs<<"モデル読み込み失敗"<<std::endl;
exit(1);
}else{
}
/*操作切替*/
mc = ModeChange::rotate;
/*ライト設定*/
LightHandle = CreateDirLightHandle(VGet(0, -1, 0));
if(LightHandle == -1)
{
exit(1);
}
SetLightEnable(false); //標準ライトを有効にするかどうか?
SetUseLighting(false);
SetUseZBuffer3D(true);
SetWriteZBuffer3D(true);
handle = LoadGraph("assets/resource/texturePos.png");
handle2 = LoadGraph("assets/resource/Enemy.png");
/*
cameraPos.x = 34;
cameraPos.y = 174;
cameraPos.z = -676;
*/
cameraPos.x = 0;
cameraPos.y = 0;
cameraPos.z = -26;
targetV.x = 0;
targetV.y = 0;
targetV.z = 0;
/*マテリアル関係*/
materialName = (char*)MV1GetMaterialName(modelHandle,0);
if(materialName == NULL){
exit(1);
}else{
ofs << "material name: " << materialName << std::endl;
}
/*テクスチャ関係*/
// ofs << "テクスチャ数: " << MV1GetTextureNum(modelHandle) << std::endl;//設定してあるテクスチャ数
ofs << "マテリアル数: " << MV1GetMaterialNum(modelHandle) << std::endl;//設定してあるマテリアル数
ofs<<"メッシュ数: "<<MV1GetMeshNum(modelHandle)<<std::endl;//設定してあるメッシュの数
if(handle == -1)
{
ofs<<"画像読み込み失敗"<<std::endl;
exit(1);
}
textureName = (char*)MV1GetTextureName(modelHandle,0);
if(textureName == NULL){
ofs<<" MV1GetTextureName() error "<<std::endl;
exit(1);
}else{
ofs << "texture name: " << textureName << std::endl;
}
COLOR_F t;
t.r = 1;
t.g = 1;
t.b = 1;
t.a = 1;
if(MV1SetMaterialDifColor(modelHandle,0,t) == -1)
{
ofs << " MV1SetMaterialDifColor() error " << std::endl;
exit(1);
//ofs<<""<<std::endl;
}
COLOR_F c = MV1GetMaterialDifColor(modelHandle,0);
ofs << "r: " << c.r << " g: " << c.g << " b: " << c.b << std::endl;
ofs<< ": "<< MV1GetMeshTriangleNum(modelHandle,0)<< std::endl;
MV1SetPosition(modelHandle,model_pos);
////////////////////////////////////////////////////////////////////////////////////////////////
animation = MV1AttachAnim(modelHandle, 1, -1, false);
////////////////////////////////////////////////////////////////////////////////////////////////
//animation = MV1GetAnimIndex(modelHandle, "assets/resource/Motion/AnimationTest.vmd");
//animation = MV1GetAnimNum(modelHandle);
if (animation == -1)
{
ofs << "モーション読み込みエラー" << std::endl;
exit(1);
}else
{
ofs << "モーション数: "<<animation << std::endl;
}
/*地面描画 頂点を設定*/
Ground_Index[0] = 0;
Ground_Index[1] = 1;
Ground_Index[2] = 2;
Ground_Index[3] = 1;
Ground_Index[4] = 3;
Ground_Index[5] = 2;
v[0].pos.x = -100;
v[0].pos.y = 10;
v[0].pos.z = 0;
v[0].norm = VGet(0.0f, 0.0f, -1.0f);
v[0].dif = color_dif;
v[0].spc = color_spc;
v[0].u = 0;
v[0].v = 0;
v[1].pos.x = +100;
v[1].pos.y = 10;
v[1].pos.z = 0;
v[1].norm = VGet(0.0f, 0.0f, -1.0f);
v[1].dif = color_dif;
v[1].spc = color_spc;
v[1].u = 1;
v[1].v = 0;
v[2].pos.x = -100;
v[2].pos.y = -10;
v[2].pos.z = 0;
v[2].norm = VGet(0.0f, 0.0f, -1.0f);
v[2].dif = color_dif;
v[2].spc = color_spc;
v[2].u = 0;
v[2].v = 1;
v[3].pos.x = +100;
v[3].pos.y = -10;
v[3].pos.z = 0;
v[3].norm = VGet(0.0f, 0.0f, -1.0f);
v[3].dif = color_dif;
v[3].spc = color_spc;
v[2].u = 1;
v[2].v = 1;
}
void Game::Update()
{
// model_rotate.x = 0;
change();
/*カメラ回転*/
if (Input::keyboard(KEY_INPUT_LEFT) > 0)
{
rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, 1, 0));
}
else if (Input::keyboard(KEY_INPUT_RIGHT) > 0)
{
rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, -1, 0));
}
else if (Input::keyboard(KEY_INPUT_UP) > 0)
{
rotate(&cameraPos,ROTATE_SPEED,targetV,get_axis(cameraPos,targetV,Vector(0,1,0)));
}
else if (Input::keyboard(KEY_INPUT_DOWN) > 0)
{
rotate(&cameraPos,ROTATE_SPEED,targetV,get_axis(cameraPos,targetV,Vector(0,-1,0)));
}
/*回転*/
switch( mc ){
case ModeChange::rotate:
{
if (Input::keyboard(KEY_INPUT_W) > 0)
{
model_rotate.x = model_rotate.x + (DX_PI_F / 360.0f);
//model_rotate.x += (DX_PI / 360.0f);
}
else if (Input::keyboard(KEY_INPUT_S) > 0)
{
model_rotate.x = model_rotate.x - (DX_PI_F / 360.0f);
//model_rotate.x -= (DX_PI_F / 360.0f);
}
else if (Input::keyboard(KEY_INPUT_A) > 0)
{
model_rotate.y = model_rotate.y - (DX_PI_F / 360.0f);
}
else if (Input::keyboard(KEY_INPUT_D) > 0)
{
model_rotate.y = model_rotate.y + (DX_PI_F / 360.0f);
}
}
break;
case ModeChange::move:
if (Input::keyboard(KEY_INPUT_W) > 0)
{
model_pos.y += 1;
}
else if (Input::keyboard(KEY_INPUT_S) > 0)
{
model_pos.y -= 1;
}
else if (Input::keyboard(KEY_INPUT_A) > 0)
{
model_pos.x -= 1;
}
else if (Input::keyboard(KEY_INPUT_D) > 0)
{
model_pos.x += 1;
}
else if (Input::keyboard(KEY_INPUT_Z) > 0)
{
model_pos.z += 1;
}
else if (Input::keyboard(KEY_INPUT_X) > 0)
{
model_pos.z -= 1;
}
break;
/*スペキュラーカラーを変更*/
case ModeChange::color_spc:
if (Input::keyboard(KEY_INPUT_W) > 0)
{
}
else if (Input::keyboard(KEY_INPUT_S) > 0)
{
}
else if (Input::keyboard(KEY_INPUT_A) > 0)
{
color_spc.r += -1;
color_spc.g += -1;
color_spc.b += -1;
for (int i = 0; i < 8; i++)
{
Vertex[i].spc = color_spc;
}
for (int i = 0; i < 4; i++)
{
Ground_Vertex[i].spc = color_spc;
}
}
else if (Input::keyboard(KEY_INPUT_D) > 0)
{
color_spc.r += +1;
color_spc.g += +1;
color_spc.b += +1;
for (int i = 0; i < 8; i++)
{
Vertex[i].spc = color_spc;
}
for (int i = 0; i < 4; i++)
{
Ground_Vertex[i].spc = color_spc;
}
}
break;
/*ディフューズカラーを変更*/
case ModeChange::color_dif:
if (Input::keyboard(KEY_INPUT_W) > 0)
{
}
else if (Input::keyboard(KEY_INPUT_S) > 0)
{
}
else if (Input::keyboard(KEY_INPUT_A) > 0)
{
color_dif.r += -1;
color_dif.g += -1;
color_dif.b += -1;
for(int i = 0 ;i < 8; i++)
{
Vertex[i].dif = color_dif;
}
for (int i = 0; i < 4; i++)
{
Ground_Vertex[i].dif = color_dif;
}
}
else if (Input::keyboard(KEY_INPUT_D) > 0)
{
color_dif.r += +1;
color_dif.g += +1;
color_dif.b += +1;
for (int i = 0; i < 8; i++)
{
Vertex[i].dif = color_dif;
}
for (int i = 0; i < 4; i++)
{
Ground_Vertex[i].dif = color_dif;
}
}
break;
}
for (int i = 0; i < 4; i++)
{
v[i].dif = color_dif;
v[i].spc = color_spc;
}
// Vertex_Norm();
}
/*確認用 描画*/
void Game::Debug_Draw()
{
DrawFormatString(0, 0, GetColor(255, 255, 255), "カメラ 座標 x: %.2f , y: %.2f , z:%.2f ", cameraPos.x, cameraPos.y, cameraPos.z);
DrawFormatString(0, 32 * 1, GetColor(255, 255, 255), "注視点 座標 x: %.2f , y: %.2f , z:%.2f ", targetV.x, targetV.y, targetV.z);
switch ( mc )
{
case ModeChange::rotate:
{
// ofs<<"rotate"<<std::endl;
DrawFormatString(0, 32 * 2, GetColor(255, 255, 255), "-------------- Rotate --------------");
DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "回転軸: %.2f , %.2f , %.2f", model_rotate.x, model_rotate.y, model_rotate.z);
}
break;
case ModeChange::move:
{
DrawFormatString(0, 32 * 2, GetColor(255, 255, 255), "-------------- Move --------------");
}
break;
case ModeChange::color_dif:
{
DrawFormatString(0, 32 * 2, GetColor(255, 255, 255), "-------------- Color_dif --------------");
DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "R: %d", color_dif.r);
DrawFormatString(0, 32 * 4, GetColor(255, 255, 255), "G: %d", color_dif.g);
DrawFormatString(0, 32 * 5, GetColor(255, 255, 255), "B: %d", color_dif.b);
// DrawFormatString(0, 32 * 4, GetColor(255, 255, 255), "G: %d", color_dif.g);
// DrawFormatString(0, 32 * 5, GetColor(255, 255, 255), "B: %d", color_dif.b);
}
break;
case ModeChange::color_spc:
{
DrawFormatString(0, 32 * 2, GetColor(255, 255, 255), "-------------- Color_spc --------------");
DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "R: %d", color_spc.r);
DrawFormatString(0, 32 * 4, GetColor(255, 255, 255), "G: %d", color_spc.g);
DrawFormatString(0, 32 * 5, GetColor(255, 255, 255), "B: %d", color_spc.b);
}
break;
}
VECTOR p = MV1GetPosition(modelHandle);
DrawFormatString(0, 32 * 10, GetColor(255, 255, 255), "モデル座標: %.2f , %.2f , %.2f", p.x, p.y, p.z);
p = MV1GetRotationXYZ(modelHandle);
DrawFormatString(0,32 * 11,GetColor(255,255,255),"モデル回転: %.2f , %.2f , %.2f",p.x,p.y,p.z);
}
void Game::DrawUpdate()
{
// DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "chqnge();");
SetCameraPositionAndTarget_UpVecY(VGet(cameraPos.x, cameraPos.y, cameraPos.z), VGet(targetV.x, targetV.y, targetV.z));
/*モデル表示*/
if (MV1DrawModel(modelHandle) == -1) { exit(1); }
if (MV1SetPosition(modelHandle, model_pos) == -1) { exit(1); }//座標
if (MV1SetRotationXYZ(modelHandle,model_rotate) == -1 ){ exit(1); }//回転
/*地面ポリゴン描画*/
//if (DrawPolygonIndexed3D(v, 4, Ground_Index, 2, handle, false) == -1) { ofs << "地面描画エラー" << std::endl; exit(1); }
//if(DrawPolygonIndexed3D(v,4,Ground_Index,2,DX_NONE_GRAPH,false) == -1){ ofs << "地面描画エラー" <<std::endl; exit(1); }
//if (DrawPolygon3D(v, 1, handle, false) == -1) { exit(1); }
// if(DrawPolygon3D(v,1,DX_NONE_GRAPH,false) == -1){ exit(1); }
/*ライト*/
//LetLightEnableHandle(LightHandle,true);
Debug_Draw();
}