亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xmath.h

?? 一個簡單的數學庫.但是很實用..大家可以下載過去研究一下.
?? H
?? 第 1 頁 / 共 3 頁
字號:
{
	r.x=v.x*m(0,0)+v.y*m(1,0)+m(2,0);
	r.y=v.x*m(0,1)+v.y*m(1,1)+m(2,1);
}

// 3D向量和4D齊次矩陣相乘
template<class T>
void vec_mul_mat(const CVector<T,3> &v, const CMatrix<T,4,3> &m, CVector<T,3> &r)
{
	// 假設m的最后一列為[0,0,0,1]T,并使用4X3矩陣表示
	r.x=v.x*m(0,0)+v.y*m(1,0)+v.z*m(2,0)+m(3,0);
	r.y=v.x*m(0,1)+v.y*m(1,1)+v.z*m(2,1)+m(3,1);
	r.z=v.x*m(0,2)+v.y*m(1,2)+v.z*m(2,2)+m(3,2);
}

template<class T>
void vec_mul_mat(const CVector<T,3> &v, const CMatrix<T,4,4> &m, CVector<T,3> &r)
{
	r.x=v.x*m(0,0)+v.y*m(1,0)+v.z*m(2,0)+m(3,0);
	r.y=v.x*m(0,1)+v.y*m(1,1)+v.z*m(2,1)+m(3,1);
	r.z=v.x*m(0,2)+v.y*m(1,2)+v.z*m(2,2)+m(3,2);
}

///////////////////////////////////////////////////////////////////////////////////

//
// 四元數
//

template<class T>
class CQuaternion
{
//
// 數據
//
public:
	union
	{
		T	M[4];
		struct
		{
			T	qa;
			CVector<T,3> qv;
		};
		struct
		{
			T	w,x,y,z;
		};
	};
//
// 構造/析構函數
//
public:
	CQuaternion () {}

	~CQuaternion () {}

	// COPY構造函數
	CQuaternion (const CQuaternion<T> &q)
	{
		*this=q;
	}
	CQuaternion& operator = (const CQuaternion<T> &q)
	{
		qa=q.qa;
		qv=q.qv;
		return *this;
	}

	// 根據旋轉向量和旋轉角構建四元數
	CQuaternion (const CVector<T,3> &v, T theta)
	{
		FromVectorAngle(theta,v);
	}

	// 與3D向量間的轉換
	CQuaternion (const CVector<T,3> &v):
		qa(0), qv(v)
	{}
	inline CQuaternion& operator = (const CVector<T,3> &v)
	{
		qa = 0;
		qv = v;
		return *this;
	}

//
// 外部接口
//
public:
	//
	// 四元數基本運算
	//
	inline CQuaternion& operator += (const CQuaternion &q)
	{
		return Add(q);
	}
	inline CQuaternion& operator -= (const CQuaternion &q)
	{
		return Sub(q);
	}
	// 四元數加法
	inline CQuaternion& Add (const CQuaternion &q)
	{
		w += q.w;
		x += q.x;
		y += q.y;
		z += q.z;
		return *this;
	}
	inline CQuaternion& Add (const CQuaternion &q1, const CQuaternion &q2)
	{
		w = q1.w + q2.w;
		x = q1.x + q2.x;
		y = q1.y + q2.y;
		z = q1.z + q2.z;
		return *this;
	}
	// 四元數減法
	inline CQuaternion& Sub (const CQuaternion &q)
	{
		w -= q.w;
		x -= q.x;
		y -= q.y;
		z -= q.z;
		return *this;
	}
	inline CQuaternion& Sub (const CQuaternion &q1, const CQuaternion &q2)
	{
		w = q1.w - q2.w;
		x = q1.x - q2.x;
		y = q1.y - q2.y;
		z = q1.z - q2.z;
		return *this;
	}
	// 標量乘法
	inline CQuaternion& Scale (T val)
	{
		w *= val;
		x *= val;
		y *= val;
		z *= val;
		return *this;
	}
	// 點積
	inline T Dot (const CQuaternion &q)
	{
		return (w*q.w + x*q.x + y*q.y + z*q.z);
	}
	// 四元數乘法,this=q1*q2
	CQuaternion& Mul (const CQuaternion &q1, const CQuaternion &q2)
	{
		//
		// 公式:[ w1*w2 - (v1 dot v2), w1*v2 + w2*v1 + (v1 cross v2) ]
		//
		// 直接計算,16次乘法,12次加法
		/*
		w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
		x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y;
		y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
		z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w;
		*/
		
		// 通過提取公共因子的改進算法,9次乘法,27次加法

		T a0 = (q1.z - q1.y) * (q2.y - q2.z);
		T a1 = (q1.w + q1.x) * (q2.w + q2.x);
		T a2 = (q1.w - q1.x) * (q2.y + q2.z);
		T a3 = (q1.y + q1.z) * (q2.w - q2.x);
		T a4 = (q1.z - q1.x) * (q2.x - q2.y);
		T a5 = (q1.z + q1.x) * (q2.x + q2.y);
		T a6 = (q1.w + q1.y) * (q2.w - q2.z);
		T a7 = (q1.w - q1.y) * (q2.w + q2.z);

		T a8 = a5 + a6 + a7;
		T a9 = T(0.5 * (a4 + a8));

		w = a0 + a9 - a5;
		x = a1 + a9 - a8;
		y = a2 + a9 - a7;
		z = a3 + a9 - a6;
		
		return *this;
	}
	// 求q1到q2的角度變換,結果保存在this中
	CQuaternion& Difference (const CQuaternion &q1, const CQuaternion &q2)
	{
		CQuaternion tmp=q1;
		tmp.Inverse();
		Mul(tmp,q2);
		return *this;
	}
	// 四元數的值
	inline T Magnitude () const
	{
		return (sqrt(Magnitude2()));
	}
	// 值的平方
	inline T Magnitude2 () const
	{
		return (w*w + x*x + y*y + z*z);
	}
	// 將this設為它的共軛
	inline CQuaternion& Conjugate ()
	{
		x = -x;
		y = -y;
		z = -z;
		return *this;
	}
	// 將this設為它的逆
	CQuaternion& Inverse ()
	{
		T inv = Magnitude();
		inv = 1/inv;
		Conjugate().Scale(inv);
		return *this;
	}
	// 單位四元數的逆
	inline CQuaternion& InverseUnit()
	{
		Conjugate();
	}
	// log(this)
	CQuaternion& Log (const CQuaternion &q)
	{
		T a = acos(q.w);
		w = 0;
		x = y = z = a;
		return *this;
	}
	// e^this
	CQuaternion& Exp (const CQuaternion &q)
	{
		T a = q.x;
		w = cos(a);
		x = y = z = sin(a);
		return *this;
	}
	// this^(t)
	inline CQuaternion& Power (T t)
	{
		return (Log(*this).Scale(t).Exp(*this));
	}
	// 根據轉軸和轉角構造四元數
	// 參數normalized指出傳入的向量是否單位向量
	void FromVectorAngle (const CVector<T,3> &v, T angle, bool normalized = true)
	{
		angle /= 2;
		T sina;		
		if(!normalized)
		{
			// 如果不是單位向量,先要將其規(guī)整為單位向量
			T len = v.Length();
			len = 1/len;
			sina = sin(angle) * len;
		}
		else
		{
			sina = sin(angle);
		}
		w = cos(angle);
		x = v.x * sina;
		y = v.y * sina;
		z = v.z * sina;
	}
	// 從四元數中提取轉軸和轉角
	void ToVectorAngle (CVector<T,3> &v, T &angle) const
	{
		angle = acos(w);
		T inv_sina = sin(angle);
		if(inv_sina == 0)
		{
			v.x = v.y = v.z = 0;
		}
		else
		{
			inv_sina = 1/inv_sina;
			v.x = x * inv_sina;
			v.y = y * inv_sina;
			v.z = z * inv_sina;
		}
		angle *= 2;
	}
};

typedef CQuaternion<int>	QUATi;
typedef CQuaternion<float>	QUATf;
typedef CQuaternion<double>	QUATd;

//
// 全局運算符重載
//
template<class T>
inline CQuaternion<T> operator + (const CQuaternion<T> &q1, const CQuaternion<T> &q2)
{
	CQuaternion q;
	return q.Add(q1,q2);
}

template<class T>
inline CQuaternion<T> operator - (const CQuaternion<T> &q1, const CQuaternion<T> &q2)
{
	CQuaternion q;
	return q.Sub(q1,q2);
}

template<class T>
inline CQuaternion<T> operator * (const CQuaternion<T> &q1, const CQuaternion<T> &q2)
{
	CQuaternion q;
	return q.Mul(q1,q2);
}

template<class T>
inline CQuaternion<T> operator / (const CQuaternion<T> &q1, const CQuaternion<T> &q2)
{
	CQuaternion q;
	return q.Difference(q1,q2);
}


///////////////////////////////////////////////////////////////////////////////

//
// 角度變換函數
//

//
// 歐拉角
//
template<class T>
struct CEuler
{
	union
	{
		T M[3];
		struct
		{
			T x, y, z;
		};
		struct
		{
			T pitch, yaw, roll;
		};
	};
};

typedef CEuler<int>		EULERi;
typedef CEuler<float>	EULERf;
typedef CEuler<double>	EULERd;

// 涉及歐拉角的轉換中,均默認使用roll-pitch-yaw(Z-Y-X)的旋轉順序

//
// 歐拉角和旋轉矩陣之間的轉換
//

template<class T>
void EulerToMatrix3D (const CEuler<T> &euler, CMatrix<T, 3, 3> &mat)
{
	T sinr = sin(euler.roll);
	T sinp = sin(euler.pitch);
	T siny = sin(euler.yaw);
	
	T cosr = cos(euler.roll);
	T cosp = cos(euler.pitch);
	T cosy = cos(euler.yaw);

	T cosy_cosr = cosy * cosr;
	T cosy_sinr = cosy * sinr;
	T siny_cosr = siny * cosr;
	T siny_sinr = siny * sinr;

	mat(0,0) = cosy_cosr + siny_sinr * sinp;
	mat(0,1) = sinr * cosp;
	mat(0,2) = cosy_sinr * sinp - siny_cosr;
	mat(1,0) = siny_cosr * sinp - cosy_sinr;
	mat(1,1) = cosr * cosp;
	mat(1,2) = siny_sinr + cosy_cosr * sinp;
	mat(2,0) = siny * cosp;
	mat(2,1) = - sinp;
	mat(2,2) = cosy * cosp;
}

template<class T>
void Matrix3DToEuler (const CMatrix<T, 3, 3> &mat, CEuler<T> &euler)
{
	// 由于浮點數存在波動,需要作一些處理
	T M21 = mat(2,1);
	if (M21>=1.0)
		euler.pitch = PI_DIV_2;
	else if (M21<=-1.0)
		euler.pitch = -PI_DIV_2;
	else
		euler.pitch = asin(-mat(2,1));
	
	if (M21>0.99999)
	{
		// gimbal lock
		euler.roll = 0;
		euler.yaw = asin(-mat(0,2));
	}
	else
	{
		euler.roll = atan2(mat(0,1), mat(1,1));
		euler.yaw = atan2(mat(2,0), mat(2,2));
	}
}

template<class T>
void EulerToMatrix4D (const CEuler<T> &euler, CMatrix<T, 4, 4> &mat)
{
	T sinr = sin(euler.roll);
	T sinp = sin(euler.pitch);
	T siny = sin(euler.yaw);
	
	T cosr = cos(euler.roll);
	T cosp = cos(euler.pitch);
	T cosy = cos(euler.yaw);

	T cosy_cosr = cosy * cosr;
	T cosy_sinr = cosy * sinr;
	T siny_cosr = siny * cosr;
	T siny_sinr = siny * sinr;

	mat(0,0) = cosy_cosr + siny_sinr * sinp;
	mat(0,1) = sinr * cosp;
	mat(0,2) = cosy_sinr * sinp - siny_cosr;
	mat(1,0) = siny_cosr * sinp - cosy_sinr;
	mat(1,1) = cosr * cosp;
	mat(1,2) = siny_sinr + cosy_cosr * sinp;
	mat(2,0) = siny * cosp;
	mat(2,1) = - sinp;
	mat(2,2) = cosy * cosp;

	mat(3,3) = 1;
	mat(3,0) = mat(3,1) = mat(3,2) = mat(0,3) = mat(1,3) = mat(2,3) = 0;
}

template<class T>
void Matrix4DToEuler (const CMatrix<T, 4, 4> &mat, CEuler<T> &euler)
{
	// 處理浮點數可能出現的波動
	T M21 = mat(2,1);
	if (M21>=1.0)
		euler.pitch = PI_DIV_2;
	else if (M21<=-1.0)
		euler.pitch = -PI_DIV_2;
	else
		euler.pitch = asin(-mat(2,1));
	
	if (M21>0.99999)
	{
		// gimbal lock
		euler.roll = 0;
		euler.yaw = asin(-mat(0,2));
	}
	else
	{
		euler.roll = atan2(mat(0,1), mat(1,1));
		euler.yaw = atan2(mat(2,0), mat(2,2));
	}
}

//
// 四元數和旋轉矩陣之間的轉換
//

template<class T>
void QuatToMatrix3D (const CQuaternion<T> &quat, CMatrix<T, 3, 3> &mat)
{
	// 使用臨時變量來減少乘法
	T xx = quat.x * quat.x;
	T yy = quat.y * quat.y;
	T zz = quat.z * quat.z;
	T ww = quat.w * quat.w;

	T xy = quat.x * quat.y;
	T xz = quat.x * quat.z;
	T xw = quat.x * quat.w;
	T yz = quat.y * quat.z;
	T yw = quat.y * quat.w;
	T zw = quat.z * quat.w;

	mat(0,0) = 1 - 2 * (yy+zz);
	mat(1,1) = 1 - 2 * (xx+zz);
	mat(2,2) = 1 - 2 * (xx+yy);
	
	mat(0,1) = 2 * (xy+zw);
	mat(0,2) = 2 * (xz-yw);
	mat(1,0) = 2 * (xy-zw);
	mat(1,2) = 2 * (yz+xw);
	mat(2,0) = 2 * (yw+xz);
	mat(2,1) = 2 * (yz-xw);
}

template<class T>
void Matrix3DToQuat (const CMatrix<T, 3, 3> &mat, CQuaternion<T> &quat)
{
	// 確定最大的分量
	T max_w = mat(0,0) + mat(1,1) + mat(2,2);
	T max_x = mat(0,0) - mat(1,1) - mat(2,2);
	T max_y = mat(1,1) - mat(2,2) - mat(0,0);
	T max_z = mat(2,2) - mat(0,0) - mat(1,1);
	int id=0;
	T max=max_w;
	if(max_x>max)
	{
		max=max_x;
		id=1;
	}
	if(max_y>max)
	{
		max=max_y;
		id=2;
	}
	if(max_z>max)
	{
		max=max_z;
		id=3;
	}
	// 計算四元數的值
	max = T(sqrt(max+1)*0.5);
	T mult = T(0.25/max);
	switch(id)
	{
	case 0:
		quat.w = max;
		quat.x = (mat(1,2) - mat(2,1)) * mult;
		quat.y = (mat(2,0) - mat(0,2)) * mult;
		quat.z = (mat(0,1) - mat(1,0)) * mult;
		break;
	case 1:
		quat.x = max;
		quat.w = (mat(1,2) - mat(2,1)) * mult;
		quat.y = (mat(0,1) + mat(1,0)) * mult;
		quat.z = (mat(2,0) + mat(0,2)) * mult;
		break;
	case 2:
		quat.y = max;
		quat.w = (mat(2,0) - mat(0,2)) * mult;
		quat.x = (mat(0,1) + mat(1,0)) * mult;
		quat.z = (mat(1,2) + mat(2,1)) * mult;
		break;
	case 3:
		quat.z = max;
		quat.w = (mat(0,1) - mat(1,0)) * mult;
		quat.x = (mat(2,0) + mat(0,2)) * mult;
		quat.y = (mat(1,2) + mat(2,1)) * mult;
		break;
	}
}

template<class T>
void QuatToMatrix4D (const CQuaternion<T> &quat, CMatrix<T, 4, 4> &mat)
{
	T xx = quat.x * quat.x;
	T yy = quat.y * quat.y;
	T zz = quat.z * quat.z;
	T ww = quat.w * quat.w;

	T xy = quat.x * quat.y;
	T xz = quat.x * quat.z;
	T xw = quat.x * quat.w;
	T yz = quat.y * quat.z;
	T yw = quat.y * quat.w;
	T zw = quat.z * quat.w;

	mat(0,0) = 1 - 2 * (yy+zz);
	mat(1,1) = 1 - 2 * (xx+zz);
	mat(2,2) = 1 - 2 * (xx+yy);
	
	mat(0,1) = 2 * (xy+zw);
	mat(0,2) = 2 * (xz-yw);
	mat(1,0) = 2 * (xy-zw);
	mat(1,2) = 2 * (yz+xw);
	mat(2,0) = 2 * (yw+xz);
	mat(2,1) = 2 * (yz-xw);

	mat(3,3) = 1;
	mat(3,0) = mat(3,1) = mat(3,2) = mat(0,3) = mat(1,3) = mat(2,3) = 0;
}

template<class T>
void Matrix4DToQuat (const CMatrix<T, 4, 4> &mat, CQuaternion<T> &quat)
{
	// 確定最大的分量
	T max_w = mat(0,0) + mat(1,1) + mat(2,2);
	T max_x = mat(0,0) - mat(1,1) - mat(2,2);
	T max_y = mat(1,1) - mat(2,2) - mat(0,0);
	T max_z = mat(2,2) - mat(0,0) - mat(1,1);
	int id=0;
	T max=max_w;
	if(max_x>max)
	{
		max=max_x;
		id=1;
	}
	if(max_y>max)
	{
		max=max_y;
		id=2;
	}
	if(max_z>max)
	{
		max=max_z;
		id=3;
	}
	// 計算四元數的值
	max = T(sqrt(max+1)*0.5);
	T mult = T(0.25/max);
	switch(id)
	{
	case 0:
		quat.w = max;
		quat.x = (mat(1,2) - mat(2,1)) * mult;
		quat.y = (mat(2,0) - mat(0,2)) * mult;
		quat.z = (mat(0,1) - mat(1,0)) * mult;
		break;
	case 1:
		quat.x = max;
		quat.w = (mat(1,2) - mat(2,1)) * mult;
		quat.y = (mat(0,1) + mat(1,0)) * mult;
		quat.z = (mat(2,0) + mat(0,2)) * mult;
		break;
	case 2:
		quat.y = max;
		quat.w = (mat(2,0) - mat(0,2)) * mult;
		quat.x = (mat(0,1) + mat(1,0)) * mult;
		quat.z = (mat(1,2) + mat(2,1)) * mult;
		break;
	case 3:
		quat.z = max;
		quat.w = (mat(0,1) - mat(1,0)) * mult;
		quat.x = (mat(2,0) + mat(0,2)) * mult;
		quat.y = (mat(1,2) + mat(2,1)) * mult;
		break;
	}
}

//
// 歐拉角和四元數之間的轉換
//

template<class T>
void EulerToQuat (const CEuler<T> &euler, CQuaternion<T> &quat)
{
	T r = T(euler.roll * 0.5);
	T p = T(euler.pitch * 0.5);
	T y = T(euler.yaw * 0.5);

	float cosr = cos(r);
	float cosp = cos(p);
	float cosy = cos(y);

	float sinr = sin(r);
	float sinp = sin(p);
	float siny = sin(y);

	quat.w = cosy*cosp*cosr + siny*sinp*sinr;
	quat.x = cosy*sinp*cosr + siny*cosp*sinr;
	quat.y = siny*cosp*cosr - cosy*sinp*sinr;
	quat.z = cosy*cosp*cosr - siny*sinp*cosr;
}

template<class T>
void QuatToEuler (const CQuaternion<T> &quat, CEuler<T> &euler)
{
	T tmp = -2 * (quat.y*quat.z - quat.w*quat.x);
	if(abs(tmp)>0.99999f)
	{
		// gimbal lock
		euler.pitch = PI_DIV_2*tmp;
		euler.yaw = atan2(T(-quat.x*quat.z + quat.w*quat.y), T(-quat.y*quat.y - quat.z*quat.z));
		euler.roll = 0;
	}
	else
	{
		T xx = quat.x * quat.x;
		euler.pitch = asin(tmp);
		euler.yaw = atan2(T(quat.x*quat.z + quat.w*quat.y), T(0.5 - xx - quat.y*quat.y));
		euler.roll = atan2(T(quat.x*quat.y + quat.w*quat.z), T(0.5 - xx - quat.z*quat.z));
	}
}

//////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩aⅴ一区二区三区四区| 手机精品视频在线观看| 在线观看欧美日本| 老司机一区二区| 国产精品欧美久久久久一区二区| 91在线高清观看| 国产美女娇喘av呻吟久久| 亚洲另类色综合网站| 欧美一级在线观看| 欧美日韩午夜在线| 日韩一区二区影院| 亚洲成人先锋电影| www.日韩大片| 中文字幕一区二| 国产美女精品一区二区三区| 欧美久久久久久蜜桃| 亚洲日本在线视频观看| 成人福利在线看| 亚洲欧美综合色| 处破女av一区二区| 日本黄色一区二区| 亚洲视频资源在线| 18欧美乱大交hd1984| 91在线观看美女| 亚洲欧美色一区| 欧美日产国产精品| 日本在线不卡一区| 日韩欧美专区在线| 95精品视频在线| 亚洲国产欧美日韩另类综合| 成人一区二区三区视频在线观看| 精品国产污网站| 亚洲综合免费观看高清完整版在线| 亚洲伊人色欲综合网| 狠狠色狠狠色综合系列| 欧美—级在线免费片| 色94色欧美sute亚洲线路一ni| 久久久久久久久久久电影| 99综合影院在线| 一区二区欧美精品| 日韩免费一区二区| 日韩va欧美va亚洲va久久| 日韩三级在线观看| 国产高清精品久久久久| 国产精品久久久久久久第一福利| 91丨porny丨户外露出| 亚洲一区在线观看视频| 欧美日韩国产影片| 懂色av一区二区在线播放| 337p粉嫩大胆色噜噜噜噜亚洲| 国产高清视频一区| 一区二区三区视频在线观看| 日韩一二三区视频| 国产成人一级电影| 亚洲午夜激情网站| 久久九九99视频| 国产成人免费在线观看| 日韩中文字幕不卡| 国产欧美一区二区在线观看| 日韩欧美中文字幕一区| 不卡一区二区三区四区| 精品国产乱码久久久久久久久| 成人黄色在线网站| 午夜一区二区三区在线观看| 久久嫩草精品久久久精品| 色网站国产精品| 国产乱人伦精品一区二区在线观看 | 99久久久免费精品国产一区二区| 三级一区在线视频先锋 | 一区二区三区免费网站| 91精品国产品国语在线不卡| 99久久国产免费看| 久久se精品一区二区| 亚洲日本在线a| 欧美日韩高清影院| 国产精品国产三级国产aⅴ中文 | 91在线你懂得| 韩国av一区二区三区在线观看| 日韩女优av电影在线观看| 亚洲综合网站在线观看| 国产精品理伦片| 精品久久久久一区| 欧美中文一区二区三区| 9色porny自拍视频一区二区| 亚洲最色的网站| 最新不卡av在线| 久久久五月婷婷| 精品国产乱码久久| 日韩小视频在线观看专区| 麻豆专区一区二区三区四区五区| 亚洲伦在线观看| 久久亚区不卡日本| 精品美女一区二区| 日韩免费电影网站| 国产精品一区二区在线播放| 一区免费观看视频| 国产亚洲午夜高清国产拍精品 | 久久久精品日韩欧美| 93久久精品日日躁夜夜躁欧美| 精品一区二区三区免费| 欧美精品一区二区久久久| 日本高清无吗v一区| 99免费精品在线观看| 丰满少妇在线播放bd日韩电影| 日韩精品一二区| 久久99久久久久久久久久久| 视频在线在亚洲| 日韩精品每日更新| 亚洲国产精品国自产拍av| 国产亚洲短视频| 国产日韩欧美精品电影三级在线 | 日韩欧美视频一区| 在线91免费看| 国产99久久久精品| 91免费版在线看| 色吧成人激情小说| 欧美性色黄大片| 欧美日韩亚洲综合一区二区三区| 92精品国产成人观看免费 | 亚洲电影一区二区三区| 91豆麻精品91久久久久久| 在线免费观看视频一区| 欧美日韩一区二区三区在线| 欧美日韩国产一区| 91精品国产欧美日韩| 91黄色免费版| 欧美一区二区视频观看视频| 精品久久一区二区三区| 国产色产综合产在线视频| 国产人久久人人人人爽| 久久精品在线观看| 亚洲免费观看在线观看| 亚洲精品日韩综合观看成人91| 亚洲欧美综合另类在线卡通| 亚洲一区在线电影| 亚洲高清在线精品| 美国十次了思思久久精品导航| 日本视频在线一区| aaa欧美大片| 欧美图区在线视频| 免费成人深夜小野草| 国产一区欧美一区| 国产精品一区二区无线| 欧美日韩精品专区| 欧美一区二区三区思思人| 国产精品拍天天在线| 精品伦理精品一区| 精品国产一区二区精华| 国产精品久久久久久久久久久免费看| 一区二区三区四区中文字幕| 久久精品国产亚洲a| 91小视频免费观看| 欧美日韩国产在线观看| 久久久影院官网| 伊人性伊人情综合网| 国产在线视频不卡二| 色视频成人在线观看免| 精品久久一区二区三区| 一区二区三区在线视频免费| 久久成人免费日本黄色| 日韩国产一区二| 色综合久久天天| 6080yy午夜一二三区久久| 亚洲特级片在线| 蜜乳av一区二区| 欧美另类一区二区三区| 欧美国产日本韩| 国产福利一区二区三区视频| 欧美精品aⅴ在线视频| 2020国产精品自拍| 日本网站在线观看一区二区三区| 国产经典欧美精品| 亚洲国产成人高清精品| av在线一区二区| 国产亚洲精品7777| 成人爱爱电影网址| 国产亚洲人成网站| 91在线porny国产在线看| 国产无人区一区二区三区| 日韩激情一二三区| 日韩欧美亚洲一区二区| 麻豆精品一二三| 欧美va亚洲va香蕉在线| 久久精品久久综合| 91福利社在线观看| 日韩成人精品视频| 欧美吞精做爰啪啪高潮| 亚洲777理论| 精品久久久久久久久久久久久久久| 日本伊人精品一区二区三区观看方式| 91美女视频网站| 亚洲精品成a人| 97se亚洲国产综合自在线| 亚洲电影一级黄| 欧美日韩一区精品| 国内成人自拍视频| 国产日韩精品久久久| 在线免费观看日本欧美| 亚洲国产精品嫩草影院| 国产精品亚洲一区二区三区妖精|