- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在前裁剪平面附近的 OpenGL 中绘制对象。已经定义了路径,并且相机正在沿着路径移动。现在,我想绘制随相机移动的物体,机器人不直接在前裁剪平面上。
我正在使用 Tux Racer Android 上的游戏端口并尝试在 hud.c 中使用这样的小测试函数:
void draw_triangle() {
set_gl_options(FOG_PLANE);
glPushMatrix();
{
glTranslatef(getparam_x_resolution() / 2.0, getparam_y_resolution() / 2.0, -5.0);
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f(0.0f, 50.0f, 0.0f); // Top
glVertex3f(-50.0f, -50.0f, 0.0f); // Bottom Left
glVertex3f(50.0f, -50.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing
}
glPopMatrix();
}
但它不会绘制。我哪里错了?如果 z 轴的 -5.0 太远,我不会拒绝,或者我应该为 set_gl_options()
使用一些其他选项,也就是说,我不确定应该启用/禁用什么此选项用于查看 3D 对象:
其他功能:
这是设置相机 View 的代码:
void update_view(player_data_t *plyr, scalar_t dt) {
point_t view_pt;
vector_t view_dir, up_dir, vel_dir, view_vec;
scalar_t ycoord;
scalar_t course_angle;
vector_t axis;
matrixgl_t rot_mat;
vector_t y_vec;
vector_t mz_vec;
vector_t vel_proj;
quaternion_t rot_quat;
scalar_t speed;
vector_t vel_cpy;
scalar_t time_constant_mult;
vel_cpy = plyr->vel;
speed = normalize_vector(&vel_cpy);
time_constant_mult =
1.0
/ min( 1.0,
max( 0.0,
( speed - NO_INTERPOLATION_SPEED ) /
( BASELINE_INTERPOLATION_SPEED - NO_INTERPOLATION_SPEED )));
up_dir = make_vector(0, 1, 0);
vel_dir = plyr->vel;
normalize_vector(&vel_dir);
course_angle = get_course_angle();
switch (plyr->view.mode) {
case TUXEYE: {
.
.
.
break;
}
case BEHIND: {
/* Camera-on-a-string mode */
/* Construct vector from player to camera */
view_vec = make_vector(0, sin(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE +
PLAYER_ANGLE_IN_CAMERA )), cos(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE +
PLAYER_ANGLE_IN_CAMERA )));
view_vec = scale_vector(CAMERA_DISTANCE, view_vec);
y_vec = make_vector(0.0, 1.0, 0.0);
mz_vec = make_vector(0.0, 0.0, -1.0);
vel_proj = project_into_plane(y_vec, vel_dir);
normalize_vector(&vel_proj);
/* Rotate view_vec so that it places the camera behind player */
rot_quat = make_rotation_quaternion(mz_vec, vel_proj);
view_vec = rotate_vector(rot_quat, view_vec);
/* Construct view point */
view_pt = move_point(plyr->pos, view_vec);
/* Make sure view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + MIN_CAMERA_HEIGHT;
}
/* Interpolate view point */
if (plyr->view.initialized) {
/* Interpolate twice to get a second-order filter */
int i;
for (i = 0; i < 2; i++) {
view_pt = interpolate_view_pos(plyr->pos, plyr->pos,
MAX_CAMERA_PITCH, plyr->view.pos, view_pt,
CAMERA_DISTANCE, dt,
BEHIND_ORBIT_TIME_CONSTANT * time_constant_mult);
}
}
/* Make sure interpolated view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + ABSOLUTE_MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + ABSOLUTE_MIN_CAMERA_HEIGHT;
}
/* Construct view direction */
view_vec = subtract_points(view_pt, plyr->pos);
axis = cross_product(y_vec, view_vec);
normalize_vector(&axis);
make_rotation_about_vector_matrix(rot_mat, axis,
PLAYER_ANGLE_IN_CAMERA);
view_dir = scale_vector(-1.0, transform_vector(rot_mat, view_vec));
/* Interpolate orientation of camera */
if (plyr->view.initialized) {
/* Interpolate twice to get a second-order filter */
int i;
for (i = 0; i < 2; i++) {
interpolate_view_frame(plyr->view.up, plyr->view.dir, &up_dir,
&view_dir, dt, BEHIND_ORIENT_TIME_CONSTANT);
up_dir = make_vector(0.0, 1.0, 0.0);
}
}
break;
}
case FOLLOW: {
/* Camera follows player (above and behind) */
up_dir = make_vector(0, 1, 0);
/* Construct vector from player to camera */
view_vec = make_vector(0, sin(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE +
PLAYER_ANGLE_IN_CAMERA )), cos(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE +
PLAYER_ANGLE_IN_CAMERA )));
view_vec = scale_vector(CAMERA_DISTANCE, view_vec);
y_vec = make_vector(0.0, 1.0, 0.0);
mz_vec = make_vector(0.0, 0.0, -1.0);
vel_proj = project_into_plane(y_vec, vel_dir);
normalize_vector(&vel_proj);
/* Rotate view_vec so that it places the camera behind player */
rot_quat = make_rotation_quaternion(mz_vec, vel_proj);
view_vec = rotate_vector(rot_quat, view_vec);
/* Construct view point */
view_pt = move_point(plyr->pos, view_vec);
/* Make sure view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + MIN_CAMERA_HEIGHT;
}
/* Interpolate view point */
if (plyr->view.initialized) {
/* Interpolate twice to get a second-order filter */
int i;
for (i = 0; i < 2; i++) {
view_pt = interpolate_view_pos(plyr->view.plyr_pos, plyr->pos,
MAX_CAMERA_PITCH, plyr->view.pos, view_pt,
CAMERA_DISTANCE, dt,
FOLLOW_ORBIT_TIME_CONSTANT * time_constant_mult);
}
}
/* Make sure interpolate view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + ABSOLUTE_MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + ABSOLUTE_MIN_CAMERA_HEIGHT;
}
/* Construct view direction */
view_vec = subtract_points(view_pt, plyr->pos);
axis = cross_product(y_vec, view_vec);
normalize_vector(&axis);
make_rotation_about_vector_matrix(rot_mat, axis,
PLAYER_ANGLE_IN_CAMERA);
view_dir = scale_vector(-1.0, transform_vector(rot_mat, view_vec));
/* Interpolate orientation of camera */
if (plyr->view.initialized) {
/* Interpolate twice to get a second-order filter */
int i;
for (i = 0; i < 2; i++) {
interpolate_view_frame(plyr->view.up, plyr->view.dir, &up_dir,
&view_dir, dt, FOLLOW_ORIENT_TIME_CONSTANT);
up_dir = make_vector(0.0, 1.0, 0.0);
}
}
break;
}
case ABOVE: {
/* Camera always uphill of player */
up_dir = make_vector(0, 1, 0);
/* Construct vector from player to camera */
view_vec = make_vector(0, sin(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE+
PLAYER_ANGLE_IN_CAMERA )), cos(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE+
PLAYER_ANGLE_IN_CAMERA )));
view_vec = scale_vector(CAMERA_DISTANCE, view_vec);
/* Construct view point */
view_pt = move_point(plyr->pos, view_vec);
/* Make sure view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + MIN_CAMERA_HEIGHT;
}
/* Construct view direction */
view_vec = subtract_points(view_pt, plyr->pos);
make_rotation_matrix(rot_mat, PLAYER_ANGLE_IN_CAMERA, 'x');
view_dir = scale_vector(-1.0, transform_vector(rot_mat, view_vec));
break;
}
case BIRDEYE: {
/* Camera always uphill of player */
up_dir = make_vector(0, 1, 0);
/* Construct vector from player to camera */
/*sin(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE+
PLAYER_ANGLE_IN_CAMERA ))
*/
/*cos(ANGLES_TO_RADIANS(
course_angle -
CAMERA_ANGLE_ABOVE_SLOPE+
PLAYER_ANGLE_IN_CAMERA ))
*/
view_vec = make_vector(0, 3, -0.5);
view_vec = scale_vector(CAMERA_DISTANCE, view_vec);
/* Construct view point */
view_pt = move_point(plyr->pos, view_vec);
/* Make sure view point is above terrain */
ycoord = find_y_coord(view_pt.x, view_pt.z);
if (view_pt.y < ycoord + MIN_CAMERA_HEIGHT) {
view_pt.y = ycoord + MIN_CAMERA_HEIGHT;
}
/* Construct view direction */
view_vec = subtract_points(view_pt, plyr->pos);
make_rotation_matrix(rot_mat, PLAYER_ANGLE_IN_CAMERA, 'x');
view_dir = scale_vector(-1.0, transform_vector(rot_mat, view_vec));
break;
}
default:
code_not_reached();
break;
}
/* Create view matrix */
plyr->view.pos = view_pt;
plyr->view.dir = view_dir;
plyr->view.up = up_dir;
plyr->view.plyr_pos = plyr->pos;
plyr->view.initialized = True;
setup_view_matrix(plyr);
}
已解决!问题出在使用 OpenGL 而不是 OpenGL ES。
最佳答案
Android 使用不支持 glBegin() 和 glEnd() 的 OpenGL ES,因此您的代码不会绘制任何内容。您需要使用 Vertex Buffer Objects 来绘制对象。
VBO 的经典指南在这里:http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
但您可能会发现谷歌搜索“Android OpenGL 教程”会提供一些更简单的指南。
关于c - 如何靠近前剪裁平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703523/
前一段时间写过一篇文章《 实战,一个高扩展、可视化低代码前端,详实、完整 》,得到了很多朋友的关注。 其中的逻辑编排部分过于简略,不少朋友希望能写一些关于逻辑编排的内容,本文就详细讲述一下逻辑
我正在尝试以下 Java 片段: int[] testArray={10,20,30,40}; int i= 0; testArray[i++]= testArray[i++]+1; System.o
我想知道我是否可以通过某种方式在 C++ 中进行前/后函数调用。我有一个包含很多函数的包装器类,在每次调用包装器函数后,我应该调用另一个始终相同的函数。 所以我不想像这样对每个函数调用 postFun
我有一个像这样的头文件: #pragma once #include "gamestate.h" #include "ExitListener.h" class InitialGameState :
学习左值和右值。定义是任何可以是“地址”的东西都是左值,否则就是右值。 我检查了运算符的优先级,前缀和后缀增量都比“地址”运算符具有更高的优先级。 对于下面的两个例子,谁能解释一下为什么第一个“&++
在我的学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们就地创建容器元素。从文档来看,容器似乎需要实现 push_back 函数才能与 back_iterator 一起使用。但是有没有一种方法可
我有两个关于 Java 中运算符优先级的类似问题。 第一个: int X = 10; System.out.println(X++ * ++X * X++); //it prints 1440 根据
请放轻松,不要对我开枪,因为我还是新手。 当我运行这段代码时,我完全糊涂了,终生无法弄清楚为什么: int y = 9; cout << "++y = " << ++y << "\n--y = " <
两种表达方式有区别吗: (*x)++ 和 ++(*x) 我可以看到这两个语句都替换了 *x 中 (*x+1) 的内容。但是它们之间有什么区别吗? 最佳答案 (*x)++ 计算为*x的值;作为副作用,*
我有一个如下所示的数据集: Date CONSUMER DISCR CONSUMER STAPLES ENERGY FINANCIALS HEALTH CARE
我希望检查名称字段中输入的前两个字符是否为字母 - 除此之外没有什么区别(空格、'、- 等都是公平的游戏)。这是我到目前为止所拥有的,但它不起作用。想法?谢谢! if (document.form01
我制作了一个简单的脚本,为像素和所有附近的像素着色为相同的颜色 Click foto
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我正在做一些练习,但我对这个感到困惑: public static int f (int x, int y) { int b=y--; while (b>0) { if (x%2!=0
我需要一个 4 个字符的正则表达式。前 3 个字符必须是数字,最后 1 个字符必须是字母或数字。 我形成了这个,但它不起作用 ^([0-9]{3}+(([a-zA-Z]*)|([0-9]*)))?$
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我有下面的程序,我试图找到前 1000 个素数的总和。在代码中,解决方案1和2有什么区别?为什么我不应该将 count 变量放在 if 条件之外?如果我把变量放在 if 之外,我显然没有得到我需要的答
这个问题在这里已经有了答案: Replace First N Occurrences in the String (7 个答案) 关闭 4 年前。 我有一个如下的字符串 const str = '_
我正在尝试测量以纳秒为单位的平均访问延迟,但在第一次迭代后我收到“段错误(核心转储)”。我错过了什么吗?我是否滥用了指针。这是导致错误的函数: #include #include #include
我有一个 SQL 问题 (MySQL)。我如何从下表创建一个新表(表名称:“well_master_prod_inj”)。 我需要按井名和日期聚合数据。我希望每个井名只有一行数据以及显示以下数据的列:
我是一名优秀的程序员,十分优秀!