0
已解决
王牌工作室官方
新手光能
新手光能
使用C++编写3D游戏,是无数问答人都在为之努力的梦想
真3D后面说,我学会了一种伪3D:3D Raycaster
本质上就是向玩家(点)周围做射线,获取射线与数个墙壁(数个线段)的最近一个交点,近大远小,距离玩家距离近的就渲染大一点,距离玩家远的就渲染矮一点
阅读下面代码
#include <iostream>
#include <cmath>
struct Point {
double x, y;
};
// 计算两点之间的距离
double distance(const Point& a, const Point& b) {
return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
}
// 计算点积
double dot(const Point& a, const Point& b) {
return a.x * b.x + a.y * b.y;
}
// 计算叉积
double cross(const Point& a, const Point& b) {
return a.x * b.y - a.y * b.x;
}
// 计算交点
bool getIntersection(const Point& P, double theta, const Point& A, const Point& B, Point& intersection) {
Point direction = {cos(theta), sin(theta)};
double dx = B.x - A.x;
double dy = B.y - A.y;
// 计算直线AB的参数方程
double t = (cross(P, A) * dx - cross(A, B) * dx) / (cross(direction, A - B));
double s = (cross(P, A) * dy - cross(A, B) * dy) / (cross(direction, A - B));
if (t < 0 || t > 1 || s < 0 || s > 1) {
return false; // 交点不在AB线段上
}
intersection.x = P.x + t * direction.x;
intersection.y = P.y + t * direction.y;
return true;
}
int main() {
Point P = {0, 0}; // 起点
double theta = M_PI / 4; // 射线角度,以弧度为单位
Point A = {1, 1};
Point B = {4, 4};
Point intersection;
if (getIntersection(P, theta, A, B, intersection)) {
std::cout << "交点坐标: (" << intersection.x << ", " << intersection.y << ")" << std::endl;
} else {
std::cout << "没有交点" << std::endl;
}
return 0;
}
你发现了什么,我们可以获取交点坐标,有了交点坐标,有了玩家坐标,可以计算距离和角度,进而获得渲染墙壁的高度与位置
向玩家周围发射射线,每条射线都这么判断,因为是直接使用数学函数计算,所以不存在性能问题,可以简单的看做O(1)
后面内容我还在思考,等我做出3D Raycaster程序后再发出来
0
已采纳
薛乘志
初级启示者
初级启示者
本质上就是向量运算嘛,学过的都能想出个乞丐版
这种思路主要是太慢,渲染直线还好,渲染什么实心立体图形的话复杂度高的吓人
(不如直接调opengl)
0
0
0
0