- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须生成一个黑色圆圈的图像,黑色为 (0, 0 , 0),白色为 (1, 1, 1),但我一直得到一个全黑的图像。这是我的所有代码:
#include "cast.h"
#include "collisions.h"
#include <stdio.h>
#include "math.h"
int cast_ray(struct ray r, struct sphere spheres[], int num_spheres)
{
int isFound;
struct maybe_point mp;
isFound = 0;
for (int i = 0; i < num_spheres; i++)
{
mp = sphere_intersection_point(r, spheres[i]);
if (mp.isPoint == 1)
{
isFound = 1;
}
else
{
isFound = 0;
}
}
return isFound;
}
void print_pixel(double a, double b, double c)
{
int i, j, k;
i = a * 255;
j = b * 255;
k = c * 255;
printf("%d %d %d ", i, j, k);
}
void cast_all_rays(double min_x, double max_x, double min_y, double max_y,
int width, int height, struct point eye,
struct sphere spheres[], int num_spheres)
{
double width_interval, height_interval, y, x;
int intersect;
width_interval = (max_x - min_x)/width;
height_interval = (max_y - min_y)/height;
for (y = max_y; y > min_y; y = y - height_interval)
{
for (x = min_x; x < max_x; x = x + width_interval)
{
struct ray r;
r.p = eye;
r.dir.x = x;
r.dir.y = y;
r.dir.z = 0.0;
intersect = cast_ray(r, spheres, num_spheres);
if (intersect != 0)
{
print_pixel (0, 0, 0);
}
else
{
print_pixel (1, 1, 1);
}
}
我已经有了一些我知道是正确的函数,可以确定射线是否与球体相交。我用来寻找交点的函数在函数 cast_ray 中。
sphere_intersection_point(r, spheres[i]);
print_pixel 函数通过将整数值与最大颜色值(即 255)相乘来转换整数值。
cast_all_rays 函数将光线从我们的眼睛转换到整个场景中(在更改 y 之前经过所有 x 坐标)。如果射线与球体相交,则像素点为黑色,最后形成一个黑色圆圈。
这里是 x、y 和半径的限制(注意:我使用的是 PPM 格式):
Eye at <0.0, 0.0, -14.0>.
A sphere at <1.0, 1.0, 0.0> with radius 2.0.
A sphere at <0.5, 1.5, -3.0> with radius 0.5.
min_x at -10, max_x at 10, min_y of -7.5, max_y at 7.5, width=1024, and height=768.
我需要生成一个黑色圆圈的图像,但我总是得到一个全黑的图像。我感觉问题出在 cast_all_rays 函数内部,但我似乎无法找到问题所在。感谢帮助!谢谢。
为了防止我的测试出现问题,这是我的 cast_all_rays 的 test.c 文件:
#include "collisions.h"
#include "data.h"
#include "cast.h"
#include <stdio.h>
void cast_all_rays_tests(void)
{
printf("P3\n");
printf("%d %d\n", 1024, 768);
printf("255\n");
double min_x, max_x, min_y, max_y;
int width, height;
struct point eye;
struct sphere spheres[2];
eye.x = 0.0;
eye.y = 0.0;
eye.z = -14.0;
spheres[0].center.x = 1.0;
spheres[0].center.y = 1.0;
spheres[0].center.z = 0.0;
spheres[0].radius = 2.0;
spheres[1].center.x = 0.5;
spheres[1].center.y = 1.5;
spheres[1].center.z = -3.0;
spheres[1].radius = 0.5;
min_x = -10;
max_x = 10;
min_y = -7.5;
max_y = 7.5;
cast_all_rays(min_x, max_x, min_y, max_y, width, height, eye, spheres, num_spheres);
}
int main()
{
cast_all_rays_tests();
return 0;
}
最佳答案
不确定这是否是您遇到的问题,但您应该只在与球体相交时设置 isFound
。不相交就不要设置。否则您的图像将仅受列表中最后一个球体的控制。
if (mp.isPoint == 1)
{
isFound = 1;
}
//else
//{
// isFound = 0;
//}
由于您的图片全黑,看来您的路口代码有问题或者您的视野太窄了。如果您对上述更改不满意,也许您应该发布有关 x 和 y 限制、眼睛位置以及球体位置和半径的详细信息。
我注意到的另一件事是 r.dir.z = 0.0
。您是从中减去眼睛位置以获得方向,还是您的真实光线方向?当然,您需要提供一个非零的 z 方向。通常,您根据 View 平面设置 x
和 y
并提供常量 z
例如 1
或-1
。
[编辑]
为了让下面的评论更清楚,我相信您没有正确设置光线方向。相反,您只需将方向设置为 View 平面的像素位置,而忽略眼睛位置。以下将更常见:
struct ray r;
r.p = eye;
r.dir.x = x - eye.x;
r.dir.y = y - eye.y;
r.dir.z = 0.0 - eye.z;
关于c - 为什么我的光线追踪图像全黑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16601194/
我正在尝试在 FBO 中渲染一个简单的棋盘格,然后执行 glReadPixels()。 当我在没有 FBO 的情况下执行此操作时,一切正常。所以我假设我的渲染函数没问题,glReadPixels()也
我是 Java 图形(一般的计算机图形)和 Stack Overflow 的新手,所以请帮助我并帮助我更好地表达我的问题。 目前,我正在尝试在 Java GUI 中的原始图像旁边显示 Buffered
我正在尝试使用 Three.js 加载我的 ply 文件。它奏效了,但我几乎看不到任何颜色。这里和那里有一些瞥见,但它大部分是黑色的(下面的第一张图片)。图像在 MeshLab 中正确打开(带有颜色)
主页应用程序图标没有显示我在 xcassets 中的任何图像。它只显示黑色背景。 到目前为止,我已经尝试在删除设备上的应用程序后进行清理和重建。我试过上传具有相同效果的不同图像。我也试过将图标文件直接
我是一名优秀的程序员,十分优秀!