processing / processing/processing4
Unexpected Y-axis translation when using `ortho()` and `resetMatrix()`
まだ誰も着手していません。
- 主要言語
- Java
- スター
- 494
- フォーク
- 183
- 平均マージ
- 4時間 39分
- マージ済み PR(30日)
- 3
説明
[!NOTE]
This issue is a repost of https://github.com/processing/processing/issues/6175 by @usuallyannoyed, updated and edited for tone and clarity.
Description
The ortho() function does not behave as expected.
Expected Behavior
ortho(0, width, 0, height) with a cleared modelview matrix (resetMatrix) should allow users to draw within the specified bounds (e.g., 0 to width on the x-axis and 0 to height on the y-axis).
Current Behavior
Instead, the drawing area behaves incorrectly, requiring adjustments (e.g., translating -height on the y-axis) to achieve the expected results. This behavior makes it unintuitive for users who expect the specified bounds to align with the visible viewport.
Steps to Reproduce
void setup() {
size(500, 500, P3D);
}
void draw() {
ortho(0, width, 0, height);
resetMatrix(); // clear modelview matrix
fill(255);
// Uncomment the line below to 'fix' the behavior
// translate(0, -height);
beginShape(TRIANGLES);
vertex(640, 640);
vertex(0, 640);
vertex(0, 0);
endShape();
}
Observed Result
The triangle only becomes visible when compensating for the unexpected offset by translating the y-axis.
Expected Result
The triangle should appear within the specified ortho bounds without additional transformations.
Environment
- Operating System: macOS 13.4
- Processing Version: 4.3.1
Possible Causes / Solutions
The issue appears to stem from the following block of code in the Processing source:
Despite the comment saying that The minus sign is needed to invert the Y axis., this implementation does not fully invert the y-axis as intended. Instead, it flips the y-axis around zero, resulting in all the y-coordinates being offset into negative space.
Suggested Fix
To invert the y-axis properly in normalized device coordinates (NDC), pre-multiply the projection matrix with a -1 scale for the y-axis. This can be achieved by modifying the projection matrix calculation as follows:
// Add a pre-multiplied -1 y scale to flip the y axis in NDC.
projection.set(x, 0, 0, tx,
0, -y, 0, -ty,
0, 0, z, tz,
0, 0, 0, 1);
This approach ensures the y-axis behaves as expected without requiring additional transformations.
Additional comments
This behavior stems from Processing's choice to have the Y-axis increase downward, consistent with traditional computer graphics. While reasonable, the implementation relies on ad-hoc adjustments throughout the code. Centralizing it at a lower level (NDC or viewport) and exposing it as an optional flag would provide more clarity and flexibility.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
再現用スケッチから始め、core/src/processing/opengl/PGraphicsOpenGL.java の 4482-4486 行付近にある投影行列のコードを調べ、ortho() が resetMatrix() とどのように相互作用するかに注目します。指定された Processing 4.3.1 のセットアップで動作を検証し、レンダリングされた座標を要求された境界と比較します。補正用の y 移動なしで三角形が ortho の境界内に表示されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- java
- 領域
- computer-graphics
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 45/100