このブログを検索

2020年1月12日日曜日

【C++】 DirectX11 - 三角形とレイの交差判定

【C++】 DirectX11 - 三角形とレイの交差判定
(2020年1月12日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.テクスチャファイル等を準備する。

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h
(2)Main.cpp
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

※コード抜粋
    //------------------------------------------------------------
    // 三角形とレイの交差判定
    //------------------------------------------------------------
    POINT mousepoint_c;//マウス位置
    GetCursorPos(&mousepoint_c);//マウスのスクリーン座標取得
    ScreenToClient(Window::GethWnd(), &mousepoint_c);//スクリーン座標をクライアント座標(アプリケーションの左上を(0, 0))に変換
    DirectX::XMVECTOR pos_near = DirectX::XMVectorSet(static_cast<float>(mousepoint_c.x), static_cast<float>(mousepoint_c.y), 0.0f, 0.0f);
    DirectX::XMVECTOR pos_near2 = DirectX::XMVector3Unproject(pos_near, 0, 0, vp.Width, vp.Height, vp.MinDepth, vp.MaxDepth, m_matProjection, m_matView, m_matWorld);
    DirectX::XMVECTOR pos_far = DirectX::XMVectorSet(static_cast<float>(mousepoint_c.x), static_cast<float>(mousepoint_c.y), 1.0f, 0.0f);
    DirectX::XMVECTOR pos_far2 = DirectX::XMVector3Unproject(pos_far, 0, 0, vp.Width, vp.Height, vp.MinDepth, vp.MaxDepth, m_matProjection, m_matView, m_matWorld);
    float fRayDistance;
    //三角形の3頂点をセット
    DirectX::XMVECTOR v0 = DirectX::XMVectorSet(svMap[0].Pos.x, svMap[0].Pos.y, svMap[0].Pos.z, 0.0f);
    DirectX::XMVECTOR v1 = DirectX::XMVectorSet(svMap[1].Pos.x, svMap[1].Pos.y, svMap[1].Pos.z, 0.0f);
    DirectX::XMVECTOR v2 = DirectX::XMVectorSet(svMap[2].Pos.x, svMap[2].Pos.y, svMap[2].Pos.z, 0.0f);
    //交差判定
    bool bRayHit = DirectX::TriangleTests::Intersects(pos_near2, DirectX::XMVector3Normalize(DirectX::XMVectorSubtract(pos_far2, pos_near2)), v0, v1, v2, fRayDistance);

7.実行結果
頂点インデックス0-1-2の三角形にマウスカーソルを合わせると
RayHitが1になり、RayDistanceにカメラ位置から交点(三角形とレイの交点)までの距離が格納される。


■参考文献
当たり判定

Intersects(XMVECTOR, XMVECTOR, XMVECTOR, XMVECTOR, XMVECTOR, float&) method

XMVector3Unproject function

XMVectorSubtract function

2019年12月20日金曜日

【C++】 DirectX11 - OBJファイル読み込み(複数マテリアル)

【C++】 DirectX11 - OBJファイル読み込み(複数マテリアル)
(2019年12月20日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.cube_texture.obj、cube_texture.mtl、Texture1.png、Texture2.pngを準備する(Blenderで作成)

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h //前回から変更なし
(2)Main.cpp //前回から変更なし
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

コード非公開

7.実行結果
・テクスチャ2枚

・カラーマテリアル3つ

・テクスチャ1枚+カラーマテリアル1つ


■参考文献
MESH GURU


2019年12月19日木曜日

【C++】 DirectX11 - OBJファイル読み込み(テクスチャ)

【C++】 DirectX11 - OBJファイル読み込み(テクスチャ)
(2019年12月19日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.cube.obj、cube.mtl、cube.pngを準備する(Blenderで作成)
 cube.objをメモ帳(テキストファイルエディタ)で開くと以下のとおり
# Blender v2.80 (sub 75) OBJ File: ''
# www.blender.org
mtllib cube.mtl
o Cube
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 1.000000
vt 0.625000 0.000000
vt 0.375000 0.250000
vt 0.375000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.500000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.375000 0.500000
vt 0.125000 0.750000
vt 0.125000 0.500000
vt 0.875000 0.500000
vt 0.625000 0.500000
vt 0.625000 0.250000
vt 0.625000 0.750000
vt 0.625000 1.000000
vt 0.375000 0.750000
vt 0.875000 0.750000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
usemtl Material
s off
f 5/1/1 3/2/1 1/3/1
f 3/4/2 8/5/2 4/6/2
f 7/7/3 6/8/3 8/5/3
f 2/9/4 8/10/4 6/8/4
f 1/11/5 4/12/5 2/13/5
f 5/14/6 2/9/6 6/15/6
f 5/1/1 7/16/1 3/2/1
f 3/4/2 7/7/2 8/5/2
f 7/7/3 5/17/3 6/8/3
f 2/9/4 4/18/4 8/10/4
f 1/11/5 3/19/5 4/12/5
f 5/14/6 1/20/6 2/9/6

cube.mtl
# Blender MTL File: 'None'
# Material Count: 1

newmtl Material
Ns 323.999994
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.0 0.0 0.0
Ni 1.450000
d 1.000000
illum 2
map_Kd cube.png

cube.png(1024×1024ピクセル)

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h //前回から変更なし
(2)Main.cpp //前回から変更なし
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

コード非公開

7.実行結果


■参考文献
MESH GURU


2019年12月18日水曜日

【C++】 DirectX11 - OBJファイル読み込み(法線あり)

【C++】 DirectX11 - OBJファイル読み込み(法線あり)
(2019年12月18日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.cube.objを準備する
 cube.objをメモ帳(テキストファイルエディタ)で開くと以下のとおり
v 0.5 0.5 -0.5
v 0.5 -0.5 -0.5
v 0.5 0.5 0.5
v 0.5 -0.5 0.5
v -0.5 0.5 -0.5
v -0.5 -0.5 -0.5
v -0.5 0.5 0.5
v -0.5 -0.5 0.5

vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000

f 5//1 3//1 1//1
f 3//2 8//2 4//2
f 7//3 6//3 8//3
f 2//4 8//4 6//4
f 1//5 4//5 2//5
f 5//6 2//6 6//6
f 5//1 7//1 3//1
f 3//2 7//2 8//2
f 7//3 5//3 6//3
f 2//4 4//4 8//4
f 1//5 3//5 4//5
f 5//6 1//6 2//6

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h //前回から変更なし
(2)Main.cpp //前回から変更なし
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

コード非公開

7.実行結果


■参考文献
MESH GURU


2019年12月17日火曜日

【C++】 DirectX11 - OBJファイル読み込み(法線なし)

【C++】 DirectX11 - OBJファイル読み込み(法線なし)
(2019年12月17日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.cube.objを準備する
 cube.objをメモ帳(テキストファイルエディタ)で開くと以下のとおり
v -0.5 -0.5 0.5
v -0.5 -0.5 -0.5
v -0.5 0.5 0.5
v -0.5 0.5 -0.5
v 0.5 -0.5 0.5
v 0.5 -0.5 -0.5
v 0.5 0.5 0.5
v 0.5 0.5 -0.5

f 3// 2// 1//
f 3// 4// 2//
f 2// 5// 1//
f 2// 6// 5//
f 4// 6// 2//
f 4// 8// 6//
f 4// 3// 7//
f 8// 4// 7//
f 3// 1// 5//
f 7// 3// 5//
f 6// 7// 5//
f 8// 7// 6//

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h //前回から変更なし
(2)Main.cpp //前回から変更なし
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

コード非公開

7.実行結果


■参考文献
MESH GURU


2019年12月16日月曜日

【C++】 DirectX11 - ライト改良(Phongの反射モデル)

【C++】 DirectX11 - ライト改良(Phongの反射モデル)
(2019年12月16日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.以下の6つのファイルを作成してビルドを行う。
(1)Main.h
(2)Main.cpp
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

(1)~(5)コード非公開

(6)PixelShader.hlsl
cbuffer ConstantBuffer : register(b0)
{
    matrix world;
    matrix view;
    matrix projection;
    float4 lightpos;
    float4 eyepos;
}

struct VS_OUTPUT
{
    float4 pos : SV_POSITION;
    float3 normal : NORMAL0;
};

//--------------------------------------------------------------------------------------
// ピクセルシェーダ
//--------------------------------------------------------------------------------------
float4 main(VS_OUTPUT input) : SV_TARGET
{
    //アンビエント
    float3 ambient = float3(1.0f, 1.0f, 0.0f) * 0.6f;

    //ディフューズ
    float3 L = normalize(lightpos.xyz);
    float3 N = normalize(input.normal);
    float NL = dot(N, L);
    float3 diffuse = float3(1.0f, 1.0f, 1.0f) * saturate(NL) * 0.3f;

    //スペキュラ
    float3 R = 2.0f * N * NL - L;
    float3 V = normalize(eyepos.xyz - input.normal);
    float RV = saturate(dot(R, V));
    float3 specular = float3(1.0f, 1.0f, 1.0f) * pow(RV, 10.0f) * 0.15f;

    return float4(ambient + diffuse + specular, 1.0f);
}


6.実行結果


■参考文献
~プログラミング~ DirectX 11でフォン反射モデル

2019年12月15日日曜日

【C#】Unity - 2Dオブジェクト複製(Prefab)

【C#】Unity - 2Dオブジェクト複製(Prefab)
(2019年12月15日)


■使用ソフト
・Unity Hub 2.1.3
・Unity 2019.2.11f1
・Visual Studio Community 2019


■言語
・C#


■手順
1.Unity Hub起動→プロジェクト→新規作成

2.2Dを選択→プロジェクト名、保存先を設定→作成

3.画像を用意してAssetsへドラッグ&ドロップ
start.png
サイズ:128×128ピクセル


4.画像をヒエラルキーへドラッグ&ドロップ

5.Assetsで右クリック→作成→C#スクリプト

6.作成したC#スクリプトをダブルクリックしてVisual Studioを起動

7.コードを以下のとおり変更して保存する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(0.1f, 0, 0);//右に移動
        if(transform.position.x > 5.0f)
        {
            Destroy(gameObject);//位置Xが5を超えたら消す
        }
    }
}

8.C#スクリプトをヒエラルキーのstartへドラッグ&ドロップ

9.ヒエラルキーのstartをAssetsへドラッグ&ドロップ
 Prefabが作成される

10.ヒエラルキーのstartは、右クリック→削除で削除しておく

11.Assetsで右クリック→作成→C#スクリプト

13.作成したC#スクリプトをダブルクリックしてVisual Studioを起動

14.コードを以下のとおり変更して保存する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript1 : MonoBehaviour
{
    public GameObject startPrefab;//publicを必ずつける
    float fTime;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        this.fTime += Time.deltaTime;//1フレームの時間を加算する
        if(this.fTime > 0.3f)//0.3秒ごとの処理
        {
            this.fTime = 0;
            GameObject copyStart = Instantiate(startPrefab) as GameObject;//新しいオブジェクトを作る
            int iY = Random.Range(-3, 4);//-3~3のランダムな整数を作る(-3~4ではない)
            copyStart.transform.position = new Vector3(-5.0f, iY, 0);//新しいオブジェクトの位置を設定
        }
    }
}

15.ヒエラルキーの作成→空のオブジェクトを作成

16.2つ目に作成したC#スクリプトをヒエラルキーのGameObjectへドラッグ&ドロップ

17.ヒエラルキーのGameObjectを選択してPrefabをインスペクターのStart Prefabへドラッグ&ドロップ


4.実行結果
0.3秒ごとに矢印が左端(高さランダム)に生成され、右に動いて右端で消える


■参考文献
Unityの教科書 Unity2018完全対応版