三维场景中斜抛运动顶点的生成

三维场景中斜抛运动顶点的生成

1 算法思想-斜抛运动

在这里插入图片描述

2 代码

void getparabola_vertex_2(glm::vec3 _Point, float _thetaAngle, float _fanAngle)
{
	float thetaAngle = radians(_thetaAngle);//斜角
	float fanAngle = radians(_fanAngle);//手柄指向和x轴的夹角;
	//第一个点
	float x;
	float y;
	float z;
	/*x_start = x;
	y_start = y;
	z_start = z;
	startPoint = glm::vec3(x_start, y_start, z_start);*/

	float v0 = 8;
	float te = 0;
	float av = 10;
	//计算落地点需要的时间
	float parameter_a = -0.5 * av;
	float parameter_b = v0 * sin(thetaAngle);
	float parameter_c = _Point.y;
	float x_solution = getSolution_qe_one_variable(parameter_a, parameter_b, parameter_c);//一次二次方程的解,可以这篇文章的参考文献
	te = x_solution;
	glm::vec3 pointFall;
	float pointfall_y = parameter_c + parameter_b * te + parameter_a * pow(te, 2);
	//float xTrajectory = 0;
	//float pointfall;
	float pointfall_x;
	float pointfall_z;
	float v1;
	float v2;
	/*if (_fanAngle!=0)
	{*/
	v1 = v0 * cos(thetaAngle)*cos(fanAngle);//x轴方向的速度
	v2 = v0 * cos(thetaAngle)*sin(fanAngle);//z轴方向的速度
	pointfall_x = _Point.x + v1 * te;
	pointfall_z = _Point.z + v2 * te;
	/*}
	else
	{
		pointfall_x= _Point.x+ v0 * cos(thetaAngle)*te;
		pointfall_z = _Point.z;
		xTrajectory = _Point.x;
	}*/


	pointFall = glm::vec3(pointfall_x, pointfall_y, pointfall_z);//落地点的坐标
	//t=sqrt(_Point.y)
	//计算顶点
	float t = 0;
	y = parameter_c + parameter_b * t + parameter_a * pow(t, 2);
	float step = te / 15;
	for (int i = 0; i < 16; i++, t = t + step, y = parameter_c + parameter_b * t + parameter_a * pow(t, 2))
	{
		//xTrajectory = xTrajectory + v0 * cos(thetaAngle)*t;
		x = _Point.x + v1 * t;
		z = _Point.z + v2 * t;
		/*if (_fanAngle != 0)
		{

			x = xTrajectory * sin(fanAngle);
			z = xTrajectory * cos(fanAngle);
		}
		else
		{
			x = _Point.x + v0 * cos(thetaAngle)*t;
			z = _Point.z;
			xTrajectory = _Point.x;
		}*/
		if (i == 15)
		{
			//最后一个坐标放落地点坐标,这个坐标很重要,需要自己
			teleportation_2[0 + 6 * 15] = pointFall.x;
			teleportation_2[1 + 6 * 15] = 0;
			teleportation_2[2 + 6 * 15] = pointFall.z;
			teleportation_2[3 + 6 * 15] = 0.5;
			teleportation_2[4 + 6 * 15] = 0.0;
			teleportation_2[5 + 6 * 15] = 0.5;
		}
		else
		{

			teleportation_2[0 + 6 * i] = x;
			teleportation_2[1 + 6 * i] = y;
			teleportation_2[2 + 6 * i] = z;
			teleportation_2[3 + 6 * i] = 0.5;
			teleportation_2[4 + 6 * i] = 0.0;
			teleportation_2[5 + 6 * i] = 0.5;
		}
	}
	//遍历顶点数组
	/*for (int i = 0; i < num_vertex * 6; i++)
	{
		cout << teleportation[i] << " ";
		if ((i + 1) % 6 == 0)
		{
			cout << endl;
		}
	}*/
}

3 参考文献

[1].求解一元二次方程的根c++

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里是一个简单的带空气阻力的小球运动三维空间建模的Python示例代码: ```python import math import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义常量 g = 9.8 # 重力加速度 rho = 1.2 # 空气密度 Cd = 0.47 # 小球的阻力系数 A = math.pi * (0.036 / 2) ** 2 # 小球的横截面积 m = 0.045 # 小球的质量 # 定义初始条件 v0 = 20 # 初始速度 theta = 45 # 发射角度 x0, y0, z0 = 0, 0, 0 # 初始位置 # 计算运动轨迹 dt = 0.01 # 时间间隔 vx0 = v0 * math.cos(theta * math.pi / 180) vy0 = v0 * math.sin(theta * math.pi / 180) vz0 = 0 vx, vy, vz = [vx0], [vy0], [vz0] x, y, z = [x0], [y0], [z0] while y[-1] >= 0: v = math.sqrt(vx[-1]**2 + vy[-1]**2 + vz[-1]**2) ax = -0.5 * rho * Cd * A * vx[-1] * v / m ay = -0.5 * rho * Cd * A * vy[-1] * v / m - g az = -0.5 * rho * Cd * A * vz[-1] * v / m vx.append(vx[-1] + ax * dt) vy.append(vy[-1] + ay * dt) vz.append(vz[-1] + az * dt) x.append(x[-1] + vx[-2] * dt + 0.5 * ax * dt ** 2) y.append(y[-1] + vy[-2] * dt + 0.5 * ay * dt ** 2) z.append(z[-1] + vz[-2] * dt + 0.5 * az * dt ** 2) # 绘制运动轨迹 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot(x, y, z) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show() ``` 这段代码使用了Euler方法对小球的运动轨迹进行了数值模拟,其中考虑了空气阻力的影响。最终,它将小球的运动轨迹绘制在了三维空间中,呈现出了更加真实的效果。 需要注意的是,这段代码只是一个简单的示例,它并没有考虑到一些实际问题,例如空气阻力随温度和湿度变化的影响等。如果需要更加准确的模拟,需要进行更加详细的研究和计算。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值