20191230のMacに関する記事は7件です。

【OpenGL】エンジンに頼らずゲーム作りたい -GLFWによるウィンドウの表示(1)-【1】

緒論

前回までにGLUTを用いたOpenGLの開発を勉強していたが,前回の記事にて古いプログラムであることを教えていただいたため,色々考えて今回からGLFWを用いたOpenGL開発にシフトしていく.
このシリーズを通して目指したいのはアニメ『NEW GAME!!』の劇中にて,ねねっちの製作していたような2Dアクションゲームの製作である(以下の画像がねねっちが半年で製作したゲーム).
6-5-13.jpg
C++とOpenGLを使用して,プログラムの可読性を高め,かつオブジェクト指向を意識したプログラムを書けるように心がけたい.今回の目的はGLFWによるウィンドウの表示を目的とする.

参考文献
GLFW-Documentation
GLFWによるOpenGL入門
【OpenGLでゲームを作る】GLFWを使ってウインドウを表示する

理論

GLUTとの違い

描画の部分が大きく変わっている印象を受けた.
GLUTではglBegin()からglEnd()のなかで描画を行うことができ,頂点の指定や,色の指定などにおいて簡単に描画を行っていくことができた.
しかし,GLFWにおいて,描画の難易度が上がっている.

シェーダは、GLSLと呼ばれる言語でプログラムできます。GLシェーダ言語(GL Shader Language)はOpenGLの一部です。CやJavaとは異なり、GLSLは実行時にコンパイルされます。これはアプリケーションを起動するたびにシェーダは再度コンパイルされることを意味します。

とのことで,これはOpenGLチュートリアルや先に示した参考文献に詳しく書かれているため割愛.

方法

1. GLFWの初期化

    if (!glfwInit())
    {
        std::cerr << "Can't initialize GLFW\n" << std::endl;
        return 1;
    }

まずはmain文中にて,GLFWの初期化を行う.
GLFWの関数を使用する前に必要である.失敗した場合はエラー分が出るようになってる.

int glfwInit(void)

この関数は、GLFWライブラリを初期化します。ほとんどのGLFW機能を使用する前に、GLFWを初期化する必要があります。また、初期化中または初期化後に割り当てられたリソースを解放するために、GLFWを終了する必要があります。
この関数が失敗した場合、戻る前にglfwTerminateを呼び出します。成功した場合、アプリケーションを終了する前にglfwTerminateを呼び出す必要があります。

2. ウィンドウの作成

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow* window = glfwCreateWindow(windowSize.x, windowSize.y, "Hello World", NULL, NULL);
    if (!window)
    {
        std::cerr << "Can't create GLFW window." << std::endl;
        glfwTerminate();
        return -1;
    }

ウィンドウ作成に必要な一連の流れ.
WindowHintでCreateWindowのための設定をして,ウィンドウオブジェクトに作成したオブジェクトを代入といった流れだと思う.これもウィンドウの作成に失敗した場合はエラー分が表示されるようになっている.

void glfwWindowHint(int hint, int value)

この関数は、glfwCreateWindowの次の呼び出しのヒントを設定します。ヒントは、設定されると、この関数またはglfwDefaultWindowHintsの呼び出しによって変更されるまで、またはライブラリが終了するまで、値を保持します。
この関数で設定できるのは整数値のヒントのみです。文字列値のヒントはglfwWindowHintStringで設定されます。

hintに設定したいことを入れて,valueにhintで設定する値をいれる.
設定が色々あるみたいだが,調べても少し難しかったため,参考文献中の設定をそのまま流用している.Windowhintに色々なhintとその設定値が記載されている.
やっぱり公式リファレンスが一番わかりやすいね.

GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share)

GLFWwindowのオブジェクトは、ウィンドウとコンテキストの両方をカプセル化します。これらはglfwCreateWindowで作成され、glfwDestroyWindow、または存在する場合はglfwTerminateで破棄されます。ウィンドウとコンテキストは不可分にリンクされているため、オブジェクトポインターはコンテキストとウィンドウハンドルの両方として使用されます。

widthとheightにウィンドウの大きさを入れてtitleにウィンドウのタイトルを入れる.monitorはフルスクリーンなどの設定なので今回はNULLで.

結果

次回に続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【OpenGL】エンジンに頼らずゲーム作りたい -ウィンドウの表示(1)-【1】

緒論

前回までにGLUTを用いたOpenGLの開発を勉強していたが,前回の記事にて古いプログラムであることを教えていただいたため,色々考えて今回からGLFWを用いたOpenGL開発にシフトしていく.
このシリーズを通して目指したいのはアニメ『NEW GAME!!』の劇中にて,ねねっちの製作していたような2Dアクションゲームの製作である(以下の画像がねねっちが半年で製作したゲーム).
6-5-13.jpg
C++とOpenGLを使用して,プログラムの可読性を高め,かつオブジェクト指向を意識したプログラムを書けるように心がけたい.今回の目的はGLFWによるウィンドウの表示を目的とする.

参考文献
GLFW-Documentation
GLFWによるOpenGL入門
【OpenGLでゲームを作る】GLFWを使ってウインドウを表示する

理論

GLUTとの違い

描画の部分が大きく変わっている印象を受けた.
GLUTではglBegin()からglEnd()のなかで描画を行うことができ,頂点の指定や,色の指定などにおいて簡単に描画を行っていくことができた.
しかし,GLFWにおいて,描画の難易度が上がっている.

シェーダは、GLSLと呼ばれる言語でプログラムできます。GLシェーダ言語(GL Shader Language)はOpenGLの一部です。CやJavaとは異なり、GLSLは実行時にコンパイルされます。これはアプリケーションを起動するたびにシェーダは再度コンパイルされることを意味します。

とのことで,これはOpenGLチュートリアルや先に示した参考文献に詳しく書かれているため割愛.

方法

1. GLFWの初期化

    if (!glfwInit())
    {
        std::cerr << "Can't initialize GLFW\n" << std::endl;
        return 1;
    }

まずはmain文中にて,GLFWの初期化を行う.
GLFWの関数を使用する前に必要である.失敗した場合はエラー分が出るようになってる.

int glfwInit(void)

この関数は、GLFWライブラリを初期化します。ほとんどのGLFW機能を使用する前に、GLFWを初期化する必要があります。また、初期化中または初期化後に割り当てられたリソースを解放するために、GLFWを終了する必要があります。
この関数が失敗した場合、戻る前にglfwTerminateを呼び出します。成功した場合、アプリケーションを終了する前にglfwTerminateを呼び出す必要があります。

2. ウィンドウの作成

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow* window = glfwCreateWindow(windowSize.x, windowSize.y, "Hello World", NULL, NULL);
    if (!window)
    {
        std::cerr << "Can't create GLFW window." << std::endl;
        glfwTerminate();
        return -1;
    }

ウィンドウ作成に必要な一連の流れ.
WindowHintでCreateWindowのための設定をして,ウィンドウオブジェクトに作成したオブジェクトを代入といった流れだと思う.これもウィンドウの作成に失敗した場合はエラー分が表示されるようになっている.

void glfwWindowHint(int hint, int value)

この関数は、glfwCreateWindowの次の呼び出しのヒントを設定します。ヒントは、設定されると、この関数またはglfwDefaultWindowHintsの呼び出しによって変更されるまで、またはライブラリが終了するまで、値を保持します。
この関数で設定できるのは整数値のヒントのみです。文字列値のヒントはglfwWindowHintStringで設定されます。

hintに設定したいことを入れて,valueにhintで設定する値をいれる.
設定が色々あるみたいだが,調べても少し難しかったため,参考文献中の設定をそのまま流用している.Windowhintに色々なhintとその設定値が記載されている.
やっぱり公式リファレンスが一番わかりやすいね.

GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share)

GLFWwindowのオブジェクトは、ウィンドウとコンテキストの両方をカプセル化します。これらはglfwCreateWindowで作成され、glfwDestroyWindow、または存在する場合はglfwTerminateで破棄されます。ウィンドウとコンテキストは不可分にリンクされているため、オブジェクトポインターはコンテキストとウィンドウハンドルの両方として使用されます。

widthとheightにウィンドウの大きさを入れてtitleにウィンドウのタイトルを入れる.monitorはフルスクリーンなどの設定なので今回はNULLで.

結果

次回に続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Coral Dev Boardでどうしようもなくなった場合のリカバリー(Mac使用)

mendel でログインできなくなったり、fastboot でデバイスが認識できなくなったりしたときの対処について。

方針

今迄と他に必要なもの

  1. micro SDカード
  2. micro SDカードを読み書きできるMacもしくは、その付属品
  3. イメージ書き込みソフト(balenaEtcherなど) ## DIP SWITCHの設定 DIP SWITCHにて、Boot Moodeを、SD Cardに変更します。1/2/3/4をON/OFF/ON/ONにします。

一応OSなどイメージのダウンロード

$ wget https://dl.google.com/coral/mendel/enterprise/mendel-enterprise-day-13.zip
$ unzip mendel-enterprise-day-13.zip

こちらのmendel-enterprise-day-13フォルダのツール群を使います。

recoveryイメージの書きこみ

balenaEtcherからツールをダウンロードする。
先程のフォルダのrecovery.imgを選択、あとは画面の通りに進むと書き込めます。
Snip20191230_2
- MacにSDカードさしても認識しない事があります。ゆっくりでなく勢い良くさすと認識率が上がります。嘘のような本当の話です。
- このままだとブートできないけどいいのか?と言われますが、そのまま進んで良いです。

SDカードからのブート

順番が重要です

  1. USB-Bのシリアルを繋ぎます
  2. もはやお馴染となった、screen /dev/cu.SLAB_USBtoUART 115200を実行します。
  3. micro SDカードをボードにさします。
  4. 続いてUSB-C(パワー)をさします。

そうすると、文字が出てきて u-boot> プロンプトで止まるか、hit any key to stopなどと出て、数秒以内に何か押すと先にすすまずに、u-boot>プロンプトで止められます。

fastbootの実行

$ fastboot 0

そして次に、USB-C(Data(OTG))をさしてください。
画面は固まったままですが、それで良いのでそのままほっておいて下さい。

OSの書き込み

fastbootの確認

screenを実行したのとは、違うターミナルを開いて以下を実行

$ fastboot devices
12345689a012    fastboot

みたいな感じで数値が返ってくればOK

書き込み実行

$ cd mendel-enterpriseday-13
$ bash flash.sh
...

しばらく時間がかかって書き込みが終わり、リブートがかかりますが、DIPスイッチがSD Card Boot modeままなので、ちゃんと動くわけではありません。ケーブル群を抜いて、DIPスイッチを元に戻したら終了です。

(by 団員H)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macのターミナルでログインユーザ&rootユーザのプロンプト設定の変更方法

Macのターミナルのプロンプト設定をデフォルトからLinuxのプロンプトのように変更する設定メモ

やりたいこと

変更前(デフォルト)
takahiro@ITakahiro ~ %

ユーザー名@ホスト名 ~ %

変更後
[takahiro@localhost ~]$ 

[ユーザー名@ホスト名 ~]$
※ホスト名は、「localhost」に固定

前提環境

macOS Catalina 10.15.1

1. 一般ユーザのプロンプト設定の変更

  • ログインシェルの確認
takahiro@ITakahiro ~ % echo $SHELL
/bin/zsh
takahiro@ITakahiro ~ % 

前提環境に記載のmacOSのバージョンでは、一般ユーザのデフォルトシェルはzsh
したがって、zshのプロファイル設定にてプロンプトの設定変更を行う

  • zshrcプロファイル定義のコピー&編集
takahiro@ITakahiro ~ % cp -p /etc/zshrc ~/.zshrc 
takahiro@ITakahiro ~ % 
takahiro@ITakahiro ~ % vim ~/.zshrc 
  • 以下の箇所を修正
変更前(デフォルト)
~略~
# Default prompt
PS1="%n@%m %1~ %# "
~略~
変更後(ホスト名:localhost固定)
~略~
# Default prompt
# PS1="%n@%m %1~ %# "
PS1="[${USER}@localhost %1~]%(!.#.$) "
~略~

ホスト名を表示させたくなかった為、あえて「localhost」の固定文字列にしたが、ホスト名をそのまま表示させたい場合は以下の通り定義する。

変更後(ホスト名を表示)
~略~
# Default prompt
# PS1="%n@%m %1~ %# "
PS1="[${USER}@${HOST%%.*} %1~]%(!.#.$) "
~略~
  • 設定変更後の確認
takahiro@ITakahiro ~ % source ~/.zshrc 
[takahiro@localhost ~]$

2. rootユーザのプロンプト設定の変更

  • rootユーザにログイン後デフォルトログインシェルの確認
ITakahiro:~ root# echo $SHELL
/bin/sh
ITakahiro:~ root# 
  • ここではbashのプロファイルを直接修正
ITakahiro:~ root# vim /etc/bashrc
変更前(デフォルト)
~略~
PS1='\h:\W \u\$ '
~略~
変更後(ホスト名:localhost固定)
~略~
#PS1='\h:\W \u\$ '
PS1='[\u@localhost \W]\$ '
~略~

ホスト名を表示させたくなかった為、あえて「localhost」の固定文字列にしたが、ホスト名をそのまま表示させたい場合は以下の通り定義する。

変更後(ホスト名を表示)
~略~
#PS1='\h:\W \u\$ '
PS1='[\u@\h \W]\$ '
~略~
  • 設定変更後の確認
ITakahiro:~ root# source /etc/bashrc 
[root@localhost ~]# 

上記によりターミナルからログアウト、再度ログイン時にも設定が継続される。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macでgit-prompt.sh のPROMPT_DIRTRIM が効かない解決法

起こったこと

Mac terminal(bash) で git-prompt.sh でCommand Lineをいい感じに
整形しようとしたら
現在pathの表示部分が長いときに折りたたむ

PROMPT_DIRTRIM=2

のように PROMPT_DIRTRIMが効かなかった。

解決法

bash のバージョンが古いらしい。(>= v4.0が対応のよう)
ので、バージョンアップ。
(そして利用shellの変更。)

$ brew install bash

# Add the new shell to the list of legit shells
$ sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"

# Change the shell for the user
$ chsh -s /usr/local/bin/bash

そしてterminal に入り直す。

参考

https://unix.stackexchange.com/questions/291897/prompt-dirtrim-not-working

https://gist.github.com/samnang/1759336

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JXAでFinderのカレントパスをiTerm2で開く

前々からJXAに興味があったので、練習がてら書いてみました。
AppleScriptを一から覚えるのは面倒ですが、JXAなら一度勝手が分かれば、スラスラ書けそうな気がします。同様のことをAppleScriptでやる記事は良く見かけますが、JXAでは見かけなかったので、誰かの参考になれば幸いです。

Script Editorで記述したスクリプトは、メニューバーから
File > Export...を選択し、File FormatにApplicationを選択して保存。cdtoやgo2shellなどと同様に、Finderのツールバーに配置して利用できます。

(function () {
    let finder  = Application("Finder");
    let frontWindow = finder.windows().filter(function (w) {return w.index() == 1;})[0];
    let cwd = $.NSURL.alloc.initWithString(frontWindow.target().url()).fileSystemRepresentation;

    let iterm = Application("iTerm");
    let window = iterm.createWindowWithDefaultProfile();
    let session = window.currentSession();
    session.write({text: `cd "${cwd}"`, newline: true});
    iterm.activate();
})();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MACでSambaをマウントしようとしてハマった

MACでSambaをマウントしようとしてハマったので、備忘録として残す。

まずは普通にマウントしようとして失敗

ずっと前からFinderからマウントしようすると「接続できませんでした」と失敗していたが、
この度、コマンドで試してみることに。

Terminal
$ mount -t smbfs //user@192.168.1.10/dir /Volume/dir
Password for 192.168.1.10:

パスワードを入力すると、

Terminal
$ mount_smbfs: server connection failed: No such file or directory

なんでや!あるし!
ということで、怒られた文言をそのままググってみるとヒットした。

sambaに接続できない理由?

以下がヒットしたサイト。
Mac mini can't connect to my corporate SMB server. Was working some days ago

このサイトによると、

Sierra SMB subsystem and HAXM are apparently unrelated pieces of software, but it seems they are somehow incompatible between them. In case you have SMB problems you'll have to decide which of the two you really need more

とのこと。
ハードウェアアクセラレーションを有効にするkextを入れているとどうもsambaが正常に機能しないらしい。

kextをアンインストールする

そこでサイトに有る通りkextをアンインストールする。
まずアンインストール対象がインストールされているか確認。

Terminal
$ kextstat | grep -iv apple | grep intelhaxm
   92    0 0xffffff7f8269e000 0x14000    0x14000    com.intel.kext.intelhaxm (6.0.1) 8FF2C637-0A5E-367E-B007-5B08655B1E8A <8 6 5 3 1>

こいつが犯人。ささっとアンインストールしてやる。
これのインストール時にアンインストーラも格納されるので、まずそれがあるか確認。

Terminal
$ ls /Library/Extensions/intelhaxm.kext/Contents/Resources/uninstall.sh
/Library/Extensions/intelhaxm.kext/Contents/Resources/uninstall.sh

あるからこれを実行。
ディレクトリごと消されるみたいなので、ここ配下に移動して実行するとシェルがエラーで止まっちゃうので気をつけて←これやって焦った。

Terminal
$ sudo /Library/Extensions/intelhaxm.kext/Contents/Resources/uninstall.sh

エラー終了しちゃってどう出るかわからないけど、完了するとリブートを促されるらしいのでする。
(エラー終了してもリブートしたらうまくいった)

もっかいSambaマウント

…できた。
Finderからサーバへ接続でできた。
けどこれの副作用として(当然だけど)ハードウェアアクセラレーションが使えなくなってるから
必要なら再インストールみたい。
根本的な解決方法はどうすれば…。
 
 
 

おわり。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む