processing / processing/processing4
Unexpected Y-axis translation when using `ortho()` and `resetMatrix()`
还没有人认领这个 Issue。
- 主要语言
- Java
- 星标
- 494
- 派生
- 183
- 平均合并
- 4 小时 39 分钟
- 30 天内合并 PR
- 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 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 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