質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2345閲覧

OpenGL 画面サイズが変わったら描画位置を修正して再描画させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/04 11:51

編集2021/01/04 12:23

提示画像ですがウインドウのサイズを触り全画面にすると何故か画面の中心に描画物が移りません。これはどうすればいいのでしょうか?
やりたいことは画面サイズが変わっても描画する位置を揃えることです。

過去の回答: https://teratail.com/questions/295612

イメージ説明
イメージ説明

cpp

1#include "../Header/Camera.hpp" 2 3//コンストラクタ 4Camera::Camera(glm::vec3 pos, glm::vec3 cen) 5{ 6 Position = pos; //座標 7 look = cen; //視線 8 mPrev_pos = glm::vec3(0,0,0); 9 pers = glm::mat4x4(0); 10 view = glm::mat4x4(0); 11 12} 13 14 15// 移動 16void Camera::setMove(glm::vec3 p) 17{ 18 Position = p; 19} 20 21// 視線 22void Camera::setCenter(glm::vec3 c) 23{ 24 look = c; 25} 26 27// カメラがオブジェクトを中心に追尾して回転 28void Camera::CameraLookObject(Mesh& mh, glm::vec3& v,float& speed) 29{ 30 glm::vec3 c = Position - mPrev_pos; 31 glm::qua<float> P(0, Position.x, Position.y,Position.z); 32 33 glm::qua<float> Q(cos((PI * 180 * speed) / 2.0f), glm::dot(v.x, sin((PI * 180 * speed) / 2.0f)), glm::dot(v.y, sin((PI * 180 * speed) / 2.0f)), glm::dot(v.z, sin((PI * 180 * speed) / 2.0f))); 34 glm::qua<float> R(cos((PI * 180 * speed) / 2.0f), glm::dot(-v.x, sin((PI * 180 * speed) / 2.0f)), glm::dot(-v.y, sin((PI * 180 * speed) / 2.0f)), glm::dot(-v.z, sin((PI * 180 * speed) / 2.0f))); 35 36 glm::qua<float> f = (R * P * Q); 37 glm::vec3 w(0, 0, 0); 38 w.x = f.x; 39 w.y = f.y; 40 w.z = f.z; 41 42 setMove(w + c); 43 setCenter(glm::normalize(c - Position)); 44 45 mPrev_pos = Position; 46 47} 48 49 50// ビュー行列を返す 51glm::mat4 Camera::getViewMatrix() 52{ 53 float a = f * atan((float)SCREEN_WIDTH / (float)SCREEN_HEIGHT); 54 pers = glm::perspective(a, (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.1f, 100000.0f); //透視射形行列 55 view = pers * glm::lookAt(Position, Position + look, glm::vec3(0, -1, 0)); //ビュー行列 56// printf("あざああ    %.2f\n",position.x); 57 return view; 58 59}

cpp

1#ifndef ___CAMERA_HPP_ 2#define ___CAMERA_HPP_ 3 4//自作ヘッダー 5#include "Game.hpp" 6 7//数学ライブラリ 8#include "glm/ext.hpp" 9 10/*############################################################################################################### 11# カメラ 12#################################################################################################################*/ 13 14class Camera 15{ 16public: 17 Camera(glm::vec3 pos, glm::vec3 cen); 18 19 void setMove(glm::vec3 p); //位置 20 void setCenter(glm::vec3 c); //視線 21 22 glm::mat4 getViewMatrix(); 23 //float* getViewMatrix(); 24 25 glm::vec3 getPosition() 26 { 27 return Position; 28 } 29 30 glm::vec3 getCenter() 31 { 32 return look; 33 } 34 35 36 void CameraLookObject(class Mesh& mh, glm::vec3& v, float& speed); 37 38private: 39 40 41 42 float f = (((float)SCREEN_WIDTH / (float)SCREEN_HEIGHT)) / tan(90.0f);//画角を固定 43 glm::mat4x4 pers; //透視射形行列 44 glm::mat4x4 view; //ビュー行列 45 46 47 48 glm::vec3 Position; //位置 49 glm::vec3 look; //視線 50 glm::vec3 mPrev_pos;//前の座標 51}; 52 53#endif 54 55

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/01/04 12:02

getViewMatrix などで使ってる SCREEN_WIDTH や SCREEN_HEIGHT が定数なのでは? ウインドウのサイズが変わったら新しいサイズに基づいて計算し直す必要があると思います。
退会済みユーザー

退会済みユーザー

2021/01/05 07:36

radianの回答は物体を同じ大きさ ということです。今回の質問は画面サイズが変わっても画面の中心にあるものは中心に描画してほしいという質問です。
guest

回答1

0

ベストアンサー

ウィンドウのサイズが変更されたイベントをキャッチして描画面を再設定する必要があります。そのためには glutReshapeFunc という関数が使えるでしょう。使い方に関してはこちらが参考になるかと思います(C++ ではなく C ですが)。
GLUTによる「手抜き」OpenGL入門

投稿2021/01/04 12:06

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/04 12:12

OpenGLではないのでしょうか?
txty

2021/01/05 07:54 編集

A_Kirisaki様 私もですが、glut抜きでopenglやっています。そこのところ、考慮してもらうと幸いです。
退会済みユーザー

退会済みユーザー

2021/01/05 08:27

OpenGL glViewport();関数でした。
txty

2022/05/10 16:26 編集

できたんかい。で、glViewpirt()をどこに書いたんですか。
退会済みユーザー

退会済みユーザー

2021/01/05 09:11

glViewport()関数は毎フレーム更新する関数に書きました。
txty

2022/05/10 16:26 編集

削除
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問