当前位置: 编程技术>移动开发
本页文章导读:
▪TextView设立背景色和文本颜色 TextView设置背景色和文本颜色
textView01 = (TextView)findViewById(R.id.textView01);textView02 = (TextView)findViewById(R.id.textView02);//设置背景色textView01.setText("设置了背景色黑色");//从资源文件中加载颜色textVi.........
▪ OpenGL学习笔记之glLookAt()参数中朝下向量含义 OpenGL学习笔记之glLookAt()参数中朝上向量含义
既然视点和物体的位置坐标都已确定,那镜头的方向就就知道啦,为什么还会有个朝上向量?举个简单的例子,视点比做人的眼睛,当眼睛看.........
▪ OpenGL之视图转换与全局坐标系统学习笔记 OpenGL之视图变换与全局坐标系统学习笔记
8:19 --- 9:00总结与计划 [OPENGL 学习][ 视图和模型变换] 对变换进行的思考 模型变换 视图变换 [ 投影变换] 透视投影 正投影 .........
[1]TextView设立背景色和文本颜色
来源: 互联网 发布时间: 2014-02-18
TextView设置背景色和文本颜色
textView01 = (TextView)findViewById(R.id.textView01);
textView02 = (TextView)findViewById(R.id.textView02);
//设置背景色
textView01.setText("设置了背景色黑色");
//从资源文件中加载颜色
textView01.setBackgroundDrawable(
getResources().getDrawable(R.drawable.green));
//设置文本颜色(如透明色:Color.TRANSPARENT)
textView02.setTextColor(Color.MAGENTA);
textView02.setText("设置文本颜色");
在winform或webform中,均有Control类,虽然不在同一个程序集中,但都代表“控件”的意思。在Monodroid中,表示控件的类是Android.Views.View。开发过winform或webform的朋友都知道,要在界面上显示文字,只要使用Label控件即可。在Android中,则要使用TextView。
要设置一个TextView的文本有两种方法,一是使用资源文件来定义一个字符串常数,然后在布局文件中进行引用。二是直接在后台程序中使用C#代码进行赋值。
我们先来试试第一种方法。在Resources\Values\Strings.xml文件中增加一个项,如下所示:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Hello">Hello World, Click Me!</string>
<string name="ApplicationName">MonoDroidTest</string>
<string name="myText">这是通过Strings.xml设置的文本</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Hello">Hello World, Click Me!</string>
<string name="ApplicationName">MonoDroidTest</string>
<string name="myText">这是通过Strings.xml设置的文本</string>
</resources>
然后在布局文件Main.axml中,增加一个TextView,文本引用这个新增加的字符串常量,如下所示:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/myText"
android:layout_x="30px"
android:layout_y="0px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"/>
</AbsoluteLayout>
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/myText"
android:layout_x="30px"
android:layout_y="0px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"/>
</AbsoluteLayout>
Activity1.cs中只要把Main.axml设置到ContentView即可:
view plaincopy to clipboardprint?
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
}
}
}
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
}
}
}
运行之后,就可以看到程序中出现了一行字符串,与我们在Strings.xml中设置的一样:
使用代码来设置TextView的文本就更简单了,首先在Activity的OnCreate方法里使用FindViewById方法来通过TextView的id从布局文件中找到这个TextView,然后对其Text进行赋值即可:
view plaincopy to clipboardprint?
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
TextView tv = FindViewById<TextView>(Resource.Id.myTextView);
tv.Text = "这是通过程序设置的文本";
}
}
}
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
TextView tv = FindViewById<TextView>(Resource.Id.myTextView);
tv.Text = "这是通过程序设置的文本";
}
}
}
这里提示一下,TextView不支持HTML标签的输出,所以即便写成这样:tv.Text = "<a href=/index.html"http://blog.csdn.net/ojlovecd\" >区健的博客 </a>"; 实际输出时也不会变成超链接,但若在TextView里加上了android:autoLink="all",或者在程序中使用tv.AutoLinkMask=1,那么文本中若有网址(http://),是可以被转换成超链接的:
下面我们试试更改TextView的字体颜色和背景色。在第三篇文章里我们在最后就已经试过把程序的背景色给改成了白色,是通过在Values文件下增加了一个color.xml来设置颜色常量来达到的。但实际设计中最常用的方法是使用程序控制TextView或其它对象的背景颜色。接下来我们在Layout中预先设计好两个TextView对象,并在Activity的OnCreate方法中通过两种方式更改TextView的文字颜色及背景色。
view plaincopy to clipboardprint?
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
SetContentView(Resource.Layout.Main);
TextView tv1 = FindViewById<TextView>(Resource.Id.myTextView);
tv1.Text = "这是用Drawable设置背景色的文本";
tv1.SetBackgroundDrawable(this.Resources.GetDrawable(Resource.Color.white));
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
tv2.Text = "这是用SetTextColor设置文本颜色的文本";
tv2.SetTextColor(Android.Graphics.Color.Green);
}
}
}
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
SetContentView(Resource.Layout.Main);
TextView tv1 = FindViewById<TextView>(Resource.Id.myTextView);
tv1.Text = "这是用Drawable设置背景色的文本";
tv1.SetBackgroundDrawable(this.Resources.GetDrawable(Resource.Color.white));
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
tv2.Text = "这是用SetTextColor设置文本颜色的文本";
tv2.SetTextColor(Android.Graphics.Color.Green);
}
}
}
那么定义在Strings.xml中的字符串常量我们要是在程序里要使用的话该怎么获取呢?可以使用Activity中的GetString方法:
tv1.Text = this.GetString(Resource.String.myText)。注意一点的是,如果string.xml中的字符串常数有单引号',双引号"和斜杠\等特殊字符时,记得使用转义字符(\):<string name="myText">这是?通过\'Strings.xml\"设置的文\\本</string>
Android可以设置为随着窗口大小调整缩放比例,但即便如此,开发人员还是必须知道手机屏幕的边界,以免造成布局变形问题。获取手机分辨率的方法很简单,关键是DisplayMetrics类的应用。
view plaincopy to clipboardprint?
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
DisplayMetrics dm = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(dm);
tv2.Text = string.Format("手机分辨率为:{0}×{1}", dm.WidthPixels, dm.HeightPixels);
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
DisplayMetrics dm = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(dm);
tv2.Text = string.Format("手机分辨率为:{0}×{1}", dm.WidthPixels, dm.HeightPixels);
老是要一个个指定文字的大小、颜色是不是太麻烦了点?有没有类似CSS那样的方法来指定这些样式呢?事实上是有的,在MonoDroid中,也可以通过样式(Style)的方式,来更改Layout中任何对象的外观。
我们首先在Values文件下增加一个style.xml作为我们的样式文件,然后往里面增加两种样式作为例子:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<mce:style name="TextStyle1"><!--
<item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
--></mce:style><style name="TextStyle1" mce_bogus="1"> <item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
</style>
<mce:style name="TextStyle2"><!--
<item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
--></mce:style><style name="TextStyle2" mce_bogus="1"> <item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<mce:style name="TextStyle1"><!--
<item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
--></mce:style><style name="TextStyle1" mce_bogus="1"> <item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
</style>
<mce:style name="TextStyle2"><!--
<item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
--></mce:style><style name="TextStyle2" mce_bogus="1"> <item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
</style>
</resources>
然后在布局文件中指定Style属性,使其应用style.xml里事先定义好的样式。如果vs在style下面有波浪提示你未声明“style”特性,不要管它,直接生成。
view plaincopy to clipboardprint?
<TextView android:text="@string/myText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"
mce_ />
<TextView android:id="@+id/myTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_y="30px"
mce_/>
textView01 = (TextView)findViewById(R.id.textView01);
textView02 = (TextView)findViewById(R.id.textView02);
//设置背景色
textView01.setText("设置了背景色黑色");
//从资源文件中加载颜色
textView01.setBackgroundDrawable(
getResources().getDrawable(R.drawable.green));
//设置文本颜色(如透明色:Color.TRANSPARENT)
textView02.setTextColor(Color.MAGENTA);
textView02.setText("设置文本颜色");
在winform或webform中,均有Control类,虽然不在同一个程序集中,但都代表“控件”的意思。在Monodroid中,表示控件的类是Android.Views.View。开发过winform或webform的朋友都知道,要在界面上显示文字,只要使用Label控件即可。在Android中,则要使用TextView。
要设置一个TextView的文本有两种方法,一是使用资源文件来定义一个字符串常数,然后在布局文件中进行引用。二是直接在后台程序中使用C#代码进行赋值。
我们先来试试第一种方法。在Resources\Values\Strings.xml文件中增加一个项,如下所示:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Hello">Hello World, Click Me!</string>
<string name="ApplicationName">MonoDroidTest</string>
<string name="myText">这是通过Strings.xml设置的文本</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Hello">Hello World, Click Me!</string>
<string name="ApplicationName">MonoDroidTest</string>
<string name="myText">这是通过Strings.xml设置的文本</string>
</resources>
然后在布局文件Main.axml中,增加一个TextView,文本引用这个新增加的字符串常量,如下所示:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/myText"
android:layout_x="30px"
android:layout_y="0px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"/>
</AbsoluteLayout>
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/myText"
android:layout_x="30px"
android:layout_y="0px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"/>
</AbsoluteLayout>
Activity1.cs中只要把Main.axml设置到ContentView即可:
view plaincopy to clipboardprint?
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
}
}
}
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
}
}
}
运行之后,就可以看到程序中出现了一行字符串,与我们在Strings.xml中设置的一样:
使用代码来设置TextView的文本就更简单了,首先在Activity的OnCreate方法里使用FindViewById方法来通过TextView的id从布局文件中找到这个TextView,然后对其Text进行赋值即可:
view plaincopy to clipboardprint?
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
TextView tv = FindViewById<TextView>(Resource.Id.myTextView);
tv.Text = "这是通过程序设置的文本";
}
}
}
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
TextView tv = FindViewById<TextView>(Resource.Id.myTextView);
tv.Text = "这是通过程序设置的文本";
}
}
}
这里提示一下,TextView不支持HTML标签的输出,所以即便写成这样:tv.Text = "<a href=/index.html"http://blog.csdn.net/ojlovecd\" >区健的博客 </a>"; 实际输出时也不会变成超链接,但若在TextView里加上了android:autoLink="all",或者在程序中使用tv.AutoLinkMask=1,那么文本中若有网址(http://),是可以被转换成超链接的:
下面我们试试更改TextView的字体颜色和背景色。在第三篇文章里我们在最后就已经试过把程序的背景色给改成了白色,是通过在Values文件下增加了一个color.xml来设置颜色常量来达到的。但实际设计中最常用的方法是使用程序控制TextView或其它对象的背景颜色。接下来我们在Layout中预先设计好两个TextView对象,并在Activity的OnCreate方法中通过两种方式更改TextView的文字颜色及背景色。
view plaincopy to clipboardprint?
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
SetContentView(Resource.Layout.Main);
TextView tv1 = FindViewById<TextView>(Resource.Id.myTextView);
tv1.Text = "这是用Drawable设置背景色的文本";
tv1.SetBackgroundDrawable(this.Resources.GetDrawable(Resource.Color.white));
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
tv2.Text = "这是用SetTextColor设置文本颜色的文本";
tv2.SetTextColor(Android.Graphics.Color.Green);
}
}
}
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using MonoDroidTest.Tabs;
using Android.Util;
using Java.IO;
namespace MonoDroidTest
{
[Activity(Label = "MonoDroidTest", MainLauncher = true)]
public class Activity1 : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
SetContentView(Resource.Layout.Main);
TextView tv1 = FindViewById<TextView>(Resource.Id.myTextView);
tv1.Text = "这是用Drawable设置背景色的文本";
tv1.SetBackgroundDrawable(this.Resources.GetDrawable(Resource.Color.white));
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
tv2.Text = "这是用SetTextColor设置文本颜色的文本";
tv2.SetTextColor(Android.Graphics.Color.Green);
}
}
}
那么定义在Strings.xml中的字符串常量我们要是在程序里要使用的话该怎么获取呢?可以使用Activity中的GetString方法:
tv1.Text = this.GetString(Resource.String.myText)。注意一点的是,如果string.xml中的字符串常数有单引号',双引号"和斜杠\等特殊字符时,记得使用转义字符(\):<string name="myText">这是?通过\'Strings.xml\"设置的文\\本</string>
Android可以设置为随着窗口大小调整缩放比例,但即便如此,开发人员还是必须知道手机屏幕的边界,以免造成布局变形问题。获取手机分辨率的方法很简单,关键是DisplayMetrics类的应用。
view plaincopy to clipboardprint?
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
DisplayMetrics dm = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(dm);
tv2.Text = string.Format("手机分辨率为:{0}×{1}", dm.WidthPixels, dm.HeightPixels);
TextView tv2 = FindViewById<TextView>(Resource.Id.myTextView2);
DisplayMetrics dm = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(dm);
tv2.Text = string.Format("手机分辨率为:{0}×{1}", dm.WidthPixels, dm.HeightPixels);
老是要一个个指定文字的大小、颜色是不是太麻烦了点?有没有类似CSS那样的方法来指定这些样式呢?事实上是有的,在MonoDroid中,也可以通过样式(Style)的方式,来更改Layout中任何对象的外观。
我们首先在Values文件下增加一个style.xml作为我们的样式文件,然后往里面增加两种样式作为例子:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<mce:style name="TextStyle1"><!--
<item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
--></mce:style><style name="TextStyle1" mce_bogus="1"> <item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
</style>
<mce:style name="TextStyle2"><!--
<item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
--></mce:style><style name="TextStyle2" mce_bogus="1"> <item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<mce:style name="TextStyle1"><!--
<item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
--></mce:style><style name="TextStyle1" mce_bogus="1"> <item name="android:textSize">18sp</item>
<item name="android:textColor">#ec9237</item>
</style>
<mce:style name="TextStyle2"><!--
<item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
--></mce:style><style name="TextStyle2" mce_bogus="1"> <item name="android:textSize">14sp</item>
<item name="android:textColor">#ff7f7c</item>
<item name="android:fromAlpha">0.0</item>
<item name="android:toAlpha">0.0</item>
</style>
</resources>
然后在布局文件中指定Style属性,使其应用style.xml里事先定义好的样式。如果vs在style下面有波浪提示你未声明“style”特性,不要管它,直接生成。
view plaincopy to clipboardprint?
<TextView android:text="@string/myText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myTextView"
mce_ />
<TextView android:id="@+id/myTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_y="30px"
mce_/>
[2] OpenGL学习笔记之glLookAt()参数中朝下向量含义
来源: 互联网 发布时间: 2014-02-18
OpenGL学习笔记之glLookAt()参数中朝上向量含义
既然视点和物体的位置坐标都已确定,那镜头的方向就就知道啦,为什么还会有个朝上向量?
举个简单的例子,视点比做人的眼睛,当眼睛看物体时,头朝天时(站立时)看到的物体和头朝地(倒立)时那样看到的物体的样子是不一样的.你还可以身体左右倾斜不同的角度来看物体.那么,glLookAt()哪个向上的变量就是来确定这个角度的.不过一般默认情况下是,头朝天的,也就是"那个朝上的向量"为(0,1,0).
这个涉及到视图变换里面的一些知识.线形代数和计算机图形学的一些知识也用的到。
既然视点和物体的位置坐标都已确定,那镜头的方向就就知道啦,为什么还会有个朝上向量?
举个简单的例子,视点比做人的眼睛,当眼睛看物体时,头朝天时(站立时)看到的物体和头朝地(倒立)时那样看到的物体的样子是不一样的.你还可以身体左右倾斜不同的角度来看物体.那么,glLookAt()哪个向上的变量就是来确定这个角度的.不过一般默认情况下是,头朝天的,也就是"那个朝上的向量"为(0,1,0).
这个涉及到视图变换里面的一些知识.线形代数和计算机图形学的一些知识也用的到。
[3] OpenGL之视图转换与全局坐标系统学习笔记
来源: 互联网 发布时间: 2014-02-18
OpenGL之视图变换与全局坐标系统学习笔记
8:19 --- 9:00
总结与计划
[OPENGL 学习]
[ 视图和模型变换]
对变换进行的思考
模型变换
视图变换
[ 投影变换]
透视投影
正投影
视景体裁剪
[ 视口变换]
视口变换
变换深度坐标
视图变换
时间:
9:34 --- 10:23
其是操作相机.
其包括:相机的位置, 方向
其在程序当中的实现为:
移动与旋转两个操作.
在OPENGL 当中,对于相机或物体的操作,其均是使用相同的函数.使用相机的模型矩阵.
那怎么样区分哪些是对于 相机的操作,哪些是对地物体的操作呢.
扩展:
OPENGL 变换,其是属性OPENGL APP的四大模块当中的: 显示模块.
初始模块
显示模块
用户操作模块
结束模块
初始模块:
本地窗口地创建,OPENGL 环境的建立,对象的创建
显示模块:
其是场景的建立, 包括: 相机位置的确定,相机视野大小的确定(投影).
对象在空间当中的位置与方向.
用户操作模块:
响应业务事件, 事件处理.
结束模块:
资源释放
==> OPENGL 其是一个界面的显示工具, 我们在写APP的时候,要去将界面与业务逻辑分层.以便于移植,如:将要使用DX,那也很方便的.
位置:其是由X,Y,Z所确定的,其的改变是通过translatef 来进行的.
方向: 其是描述相机的朝向, 在一个3D空间当中,对象的朝向,其是怎么样描述的,怎么样表达的,怎么样操作的.
[ 注意:]
在3D空间, 我们首先要明白的第一件事: 其是使用什么坐标系.
1. 相机的坐标系
2. 相机的默认位置 :原点
3. 相机的默认方向 : Z轴的负方向
其分成三个部分来讲解:
1. 基本的模型变换函数 ,用于视图变换,与其的意思
2. 工具函数库:gluLookAt() 其定义一条视线,其是封装了一系列的旋转和移动操作.
3. 创建自己的工具函数,对于旋转和移动的封装.其的背景与作用
[ 1. 基本的模型变换函数]
在OPENGL当中,对于相机(观察点)的变换操作,其是使用模型变换函数来完成的.
1. 要知道哪些是对于相机的操作,哪些是对于物体的操作
2. 对于相机的操作,其本质是对于物体的反操作,如:相机向Z轴的原点向正方向移动5,相当于物体在Z轴的原点向负方便移动5.
小规则:在默认情况下,操作相机向前移动,就是沿Z轴的负方向移动.如果旋转了相机那意思就不同,为什么呢,哪一点.
更简单点:相机不动,而物体动,在显示模块当中,其均是操作物化.
例子:
使用相机与物体之间距离5个单位,其是使用
glTranslatef( 0.0, 0.0, -5.0);
其的解释:
1. 将场景当中的物体沿Z轴移动 -5个单位
2. 将相机沿Z轴移动+5个单位
现在假设我们要从侧面观察物体.
背景:
相机与物体其均在原点.
分析:
观察+从侧面
观察:
因为相机与物体均原点,所以要移动相机或物体--> 3DAPP当中的显示模块其应该是要包括移动操作语句.
从侧面:
其是要旋转相机或物体,
编程实现:
我们要先写移动,还是先写旋转呢,语句的次序不同,其的效果也是不同的.
因为矩阵的乘法没的交换律A*B != B*A
我们应该是先旋转后移动.
在编写代码的时候,要先写移动后写旋转.其原因还是因为矩阵乘法不满足交换律.
这种思考问题的方式很麻烦的.(其是以全局固定坐标系统)
我们应该改变一种问题的思考方式.
局部移动坐标系统:
其的好处:逻辑次序与编写代码的次序相同.
关键:
局部+ 移动 +坐标系统
坐标系统是什么:
局部:其是相对于哪一个
移动: 其是谁移动呢.
其就为什么可以很逻辑次序与编写代码的次序相同.
-->
本质:
OPENGL 其的本质不变的.
矩阵的相乘不满足交换律也是不变的.
能够改变的:
思考问题的逻辑次序
我们使用全局固定坐标思考问题的逻辑次序与编写代码的次序相反.
局部移动坐标系统,
局部+移动+坐标系统
此坐标系统与全局固定坐标系统,初始相同.
其为什么是局部,为什么是移动呢.
局部:其是描述物体的,而全局固定坐标系统,其是描述场景的.
考虑把物体以及它的局部坐标系统 移离 原点 ===> 体现了局部移动坐标系统当中的移动特点
然后,根据经过移动的坐标系统调用旋转函数.
注意:
全局固定坐标系统与局部移动坐标系统,其在旋转的参照点不同.
前者:
总是根据全局原点进行的
后者:
根据局部坐标系统的原点进行.而此原点是会变化的.
关键:
在默认情况下,向前就是没Z轴的负方向,
默认情况:
相机与物体均是在原点处且没有旋转
一般情况:
其是要考虑是否旋转了物体或相机.,结果虽然还是移动,但其表现的效果是不同的,其可能不是沿着Z轴方向旋转而是成一定的角度方
向移动.
小结:
全局固定坐标系统与局部移动坐标系统,其的本质是相同的,只是其的思考的方式不同而矣.
其在OPENGL 的表现是一样的.OPENGL 其还是以矩阵相乘的方式进行的.
[ 使用工具函数 gluLookAt() ]
在前面的学习当中,我们知道了怎么样思考移动,旋转对象,与使用OPENGL 编程实现,
不管是全局固定坐标系统还是局部移动坐标系统,
其的本质还是:glTranslatef ,glRotatef.
为了确定一个对象在3D空间当中的位置与方向,我们要使用glTranslatef ,glRotatef
我们能否将此操作过程封装起来,留出的接口: 接口参数,在哪里,朝向,
工具函数gluLookAt其就是为了这一个目标所产生的.
显示模块的全局思路:
构建场景
布置适合地观察点
gluLookAt其就是来布置观察点的.其说明了相机的位置,相机瞄准的参考点,并且提示哪个方向是朝上(说明是正立看,还是倒
立看)
方向其是由向量来表示,向量其是由点来表示的.
向量是有大小和方向的.所以朝向应该是由向量来表达.
注意:
void gluLookAt( GLdouble eyex, GLdouble eyey,GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz.
GLdouble upx, GLdouble upy, GLdouble upz);
我们通过EYE(X,Y,Z)来指定了观察点,瞄准点,朝向.
gluLookAt 其内部是会通过glTranslatef,glRotatef ,或自定义矩阵然后调用glMultMatrixf,不管是哪些方案其均是影响
MODEL Matrixf( 模型矩阵)
其哪些参数是说明:
相机的位置( 相机位于哪一点)
相机的朝向( 相机旋转了多少)
eye 其是说明相机的位置
center 其是说明相机的朝向,也是瞄准着哪个方向看,
具体怎么样的移动,旋转其均是由gluLookAt来计算出来的.
void
gluLookAtf(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,
GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz)
{
GLfloat forward[3], side[3], up[3]; // 向量的表示
GLfloat m[4][4]; // 变换矩阵
/*
其是计算观察点与参考点之间的向量 (forward 向量)
*/
forward[0] = centerx - eyex;
forward[1] = centery - eyey;
forward[2] = centerz - eyez;
/*
其是规范化foward向量, 也就是算出单位向量(说明方向)
*/
normalizef(forward);
up[0] = upx;
up[1] = upy;
up[2] = upz;
crossf(forward, up, side);
normalizef(side);
crossf(side, forward, up);
__identf(&m[0][0]);
m[0][0] = side[0];
m[1][0] = side[1];
m[2][0] = side[2];
m[0][1] = up[0];
m[1][1] = up[1];
m[2][1] = up[2];
m[0][2] = -forward[0];
m[1][2] = -forward[1];
m[2][2] = -forward[2];
glMultMatrixf(&m[0][0]); // 之前的所有操作均是为确定怎么样旋转
glTranslatef(-eyex, -eyey, -eyez);
}
==> gluLookAt
其主要包括两个方面: 旋转,平移.
关键:
1. 旋转的向量确定,(沿着哪个向量旋转,以什么角度旋转)
2. 其是先旋转后平移.(如果先平移后旋转,那就可以相机永远在哪一个轴上)
向量
在编程当中,向量其主要是用到了向量的几何性质.
所以向量的方向,
所以向量相乘是:坐标值的相乘,而没有角度. 这些均是很关键的
投影变换
其是OPENGL当中的四大模块当中的显示模块的内容,
其是属于显示模块当中的变换部分.
其的主要功能是: 确定相机的视野.
我们自己生活在一个3D空间当中,当我们固定在一个空间当中的时候,我们所能到的东西范围是有限的.两只眼睛比一只眼睛所能观察到的东西都
一些的.
我们是看到一个空间当中的一部分.如果想观察到空间当中的其它部分,我们就要转身或旋转脑袋.
在OPENGL 当中, 其是怎么样表达一个相机的视野空间的呢.
定义好了视野空间,其又是怎么样将3D变换到2D屏幕上显示的呢.
其包括两个方面的内容:
1. 视野空间的定义
2. 视野空间当中的3D物体怎么样投影到2D屏幕上面.( 可以想象成直接忽视视野空间当中的对象的Z值)
==> 投影变换其就是来解决这一部知识的.
注意:
变换的本质:
顶点与矩阵相乘. 不同的变换,其只是矩阵的值不相同而矣.所以当我们看到一个变换的时候, 要知道其是操作什么样的矩
阵,其的矩阵值是多少.
如:视图模型矩阵其的操作 GL_MODELVIEW
投影变换其所操作的矩阵是:GL_PROJECTION
在OPENGL当中,我们要去知道,此变换函数其是操作哪一个矩阵.是:GL_MODELVIEW, GL_PROJECTION ,GL_TEXTURE.当中的哪一
个.其是通过glMatrixMode( ...) 来指定的.
但这三个矩阵其均是使用当前矩阵来进行相乘.所以为了避免之前的影响,我们会去使用glLoadIdentity(). 来将当前矩阵设置为单位
矩阵
[ 3.3.1 透视投影]
其的特点是: 与我们人眼所观察到物体对象是不一样的. 远处的东西看小些,近处的东西看大些, 但没有不清楚的功能.
透视投影流程:
1. 设置矩阵模型为GL_PROJECTION
2. 将当前矩阵设置为单位矩阵
3. 设置视景体,glFrustum
4. 根据glFrustum 的参数计算出一个矩阵.
5. 其与当前矩阵,
6. 其结果会保存在GL_PROJECTION矩阵当中.
7. 3D空间到2D屏幕上显示的时候,顶点其就会与此矩阵相乘.
注意:
平截头.其是由裁剪平面所组成的. 其包括4个侧面,顶面,底面.
裁剪平面与矩阵之间是什么关系呢.
工具函数:
gluPerspective 其是定义成一个视景体.
glFrustum其函数参数是指定近侧裁剪平面的两个角.
gluPerspective 其的参数是指定: y方向上视野的角度和纵横比( X/Y).
本文转载于:http://www.cnblogs.com/pengxinglove/archive/2010/12/31/1923371.html
8:19 --- 9:00
总结与计划
[OPENGL 学习]
[ 视图和模型变换]
对变换进行的思考
模型变换
视图变换
[ 投影变换]
透视投影
正投影
视景体裁剪
[ 视口变换]
视口变换
变换深度坐标
视图变换
时间:
9:34 --- 10:23
其是操作相机.
其包括:相机的位置, 方向
其在程序当中的实现为:
移动与旋转两个操作.
在OPENGL 当中,对于相机或物体的操作,其均是使用相同的函数.使用相机的模型矩阵.
那怎么样区分哪些是对于 相机的操作,哪些是对地物体的操作呢.
扩展:
OPENGL 变换,其是属性OPENGL APP的四大模块当中的: 显示模块.
初始模块
显示模块
用户操作模块
结束模块
初始模块:
本地窗口地创建,OPENGL 环境的建立,对象的创建
显示模块:
其是场景的建立, 包括: 相机位置的确定,相机视野大小的确定(投影).
对象在空间当中的位置与方向.
用户操作模块:
响应业务事件, 事件处理.
结束模块:
资源释放
==> OPENGL 其是一个界面的显示工具, 我们在写APP的时候,要去将界面与业务逻辑分层.以便于移植,如:将要使用DX,那也很方便的.
位置:其是由X,Y,Z所确定的,其的改变是通过translatef 来进行的.
方向: 其是描述相机的朝向, 在一个3D空间当中,对象的朝向,其是怎么样描述的,怎么样表达的,怎么样操作的.
[ 注意:]
在3D空间, 我们首先要明白的第一件事: 其是使用什么坐标系.
1. 相机的坐标系
2. 相机的默认位置 :原点
3. 相机的默认方向 : Z轴的负方向
其分成三个部分来讲解:
1. 基本的模型变换函数 ,用于视图变换,与其的意思
2. 工具函数库:gluLookAt() 其定义一条视线,其是封装了一系列的旋转和移动操作.
3. 创建自己的工具函数,对于旋转和移动的封装.其的背景与作用
[ 1. 基本的模型变换函数]
在OPENGL当中,对于相机(观察点)的变换操作,其是使用模型变换函数来完成的.
1. 要知道哪些是对于相机的操作,哪些是对于物体的操作
2. 对于相机的操作,其本质是对于物体的反操作,如:相机向Z轴的原点向正方向移动5,相当于物体在Z轴的原点向负方便移动5.
小规则:在默认情况下,操作相机向前移动,就是沿Z轴的负方向移动.如果旋转了相机那意思就不同,为什么呢,哪一点.
更简单点:相机不动,而物体动,在显示模块当中,其均是操作物化.
例子:
使用相机与物体之间距离5个单位,其是使用
glTranslatef( 0.0, 0.0, -5.0);
其的解释:
1. 将场景当中的物体沿Z轴移动 -5个单位
2. 将相机沿Z轴移动+5个单位
现在假设我们要从侧面观察物体.
背景:
相机与物体其均在原点.
分析:
观察+从侧面
观察:
因为相机与物体均原点,所以要移动相机或物体--> 3DAPP当中的显示模块其应该是要包括移动操作语句.
从侧面:
其是要旋转相机或物体,
编程实现:
我们要先写移动,还是先写旋转呢,语句的次序不同,其的效果也是不同的.
因为矩阵的乘法没的交换律A*B != B*A
我们应该是先旋转后移动.
在编写代码的时候,要先写移动后写旋转.其原因还是因为矩阵乘法不满足交换律.
这种思考问题的方式很麻烦的.(其是以全局固定坐标系统)
我们应该改变一种问题的思考方式.
局部移动坐标系统:
其的好处:逻辑次序与编写代码的次序相同.
关键:
局部+ 移动 +坐标系统
坐标系统是什么:
局部:其是相对于哪一个
移动: 其是谁移动呢.
其就为什么可以很逻辑次序与编写代码的次序相同.
-->
本质:
OPENGL 其的本质不变的.
矩阵的相乘不满足交换律也是不变的.
能够改变的:
思考问题的逻辑次序
我们使用全局固定坐标思考问题的逻辑次序与编写代码的次序相反.
局部移动坐标系统,
局部+移动+坐标系统
此坐标系统与全局固定坐标系统,初始相同.
其为什么是局部,为什么是移动呢.
局部:其是描述物体的,而全局固定坐标系统,其是描述场景的.
考虑把物体以及它的局部坐标系统 移离 原点 ===> 体现了局部移动坐标系统当中的移动特点
然后,根据经过移动的坐标系统调用旋转函数.
注意:
全局固定坐标系统与局部移动坐标系统,其在旋转的参照点不同.
前者:
总是根据全局原点进行的
后者:
根据局部坐标系统的原点进行.而此原点是会变化的.
关键:
在默认情况下,向前就是没Z轴的负方向,
默认情况:
相机与物体均是在原点处且没有旋转
一般情况:
其是要考虑是否旋转了物体或相机.,结果虽然还是移动,但其表现的效果是不同的,其可能不是沿着Z轴方向旋转而是成一定的角度方
向移动.
小结:
全局固定坐标系统与局部移动坐标系统,其的本质是相同的,只是其的思考的方式不同而矣.
其在OPENGL 的表现是一样的.OPENGL 其还是以矩阵相乘的方式进行的.
[ 使用工具函数 gluLookAt() ]
在前面的学习当中,我们知道了怎么样思考移动,旋转对象,与使用OPENGL 编程实现,
不管是全局固定坐标系统还是局部移动坐标系统,
其的本质还是:glTranslatef ,glRotatef.
为了确定一个对象在3D空间当中的位置与方向,我们要使用glTranslatef ,glRotatef
我们能否将此操作过程封装起来,留出的接口: 接口参数,在哪里,朝向,
工具函数gluLookAt其就是为了这一个目标所产生的.
显示模块的全局思路:
构建场景
布置适合地观察点
gluLookAt其就是来布置观察点的.其说明了相机的位置,相机瞄准的参考点,并且提示哪个方向是朝上(说明是正立看,还是倒
立看)
方向其是由向量来表示,向量其是由点来表示的.
向量是有大小和方向的.所以朝向应该是由向量来表达.
注意:
void gluLookAt( GLdouble eyex, GLdouble eyey,GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz.
GLdouble upx, GLdouble upy, GLdouble upz);
我们通过EYE(X,Y,Z)来指定了观察点,瞄准点,朝向.
gluLookAt 其内部是会通过glTranslatef,glRotatef ,或自定义矩阵然后调用glMultMatrixf,不管是哪些方案其均是影响
MODEL Matrixf( 模型矩阵)
其哪些参数是说明:
相机的位置( 相机位于哪一点)
相机的朝向( 相机旋转了多少)
eye 其是说明相机的位置
center 其是说明相机的朝向,也是瞄准着哪个方向看,
具体怎么样的移动,旋转其均是由gluLookAt来计算出来的.
void
gluLookAtf(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,
GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz)
{
GLfloat forward[3], side[3], up[3]; // 向量的表示
GLfloat m[4][4]; // 变换矩阵
/*
其是计算观察点与参考点之间的向量 (forward 向量)
*/
forward[0] = centerx - eyex;
forward[1] = centery - eyey;
forward[2] = centerz - eyez;
/*
其是规范化foward向量, 也就是算出单位向量(说明方向)
*/
normalizef(forward);
up[0] = upx;
up[1] = upy;
up[2] = upz;
crossf(forward, up, side);
normalizef(side);
crossf(side, forward, up);
__identf(&m[0][0]);
m[0][0] = side[0];
m[1][0] = side[1];
m[2][0] = side[2];
m[0][1] = up[0];
m[1][1] = up[1];
m[2][1] = up[2];
m[0][2] = -forward[0];
m[1][2] = -forward[1];
m[2][2] = -forward[2];
glMultMatrixf(&m[0][0]); // 之前的所有操作均是为确定怎么样旋转
glTranslatef(-eyex, -eyey, -eyez);
}
==> gluLookAt
其主要包括两个方面: 旋转,平移.
关键:
1. 旋转的向量确定,(沿着哪个向量旋转,以什么角度旋转)
2. 其是先旋转后平移.(如果先平移后旋转,那就可以相机永远在哪一个轴上)
向量
在编程当中,向量其主要是用到了向量的几何性质.
所以向量的方向,
所以向量相乘是:坐标值的相乘,而没有角度. 这些均是很关键的
投影变换
其是OPENGL当中的四大模块当中的显示模块的内容,
其是属于显示模块当中的变换部分.
其的主要功能是: 确定相机的视野.
我们自己生活在一个3D空间当中,当我们固定在一个空间当中的时候,我们所能到的东西范围是有限的.两只眼睛比一只眼睛所能观察到的东西都
一些的.
我们是看到一个空间当中的一部分.如果想观察到空间当中的其它部分,我们就要转身或旋转脑袋.
在OPENGL 当中, 其是怎么样表达一个相机的视野空间的呢.
定义好了视野空间,其又是怎么样将3D变换到2D屏幕上显示的呢.
其包括两个方面的内容:
1. 视野空间的定义
2. 视野空间当中的3D物体怎么样投影到2D屏幕上面.( 可以想象成直接忽视视野空间当中的对象的Z值)
==> 投影变换其就是来解决这一部知识的.
注意:
变换的本质:
顶点与矩阵相乘. 不同的变换,其只是矩阵的值不相同而矣.所以当我们看到一个变换的时候, 要知道其是操作什么样的矩
阵,其的矩阵值是多少.
如:视图模型矩阵其的操作 GL_MODELVIEW
投影变换其所操作的矩阵是:GL_PROJECTION
在OPENGL当中,我们要去知道,此变换函数其是操作哪一个矩阵.是:GL_MODELVIEW, GL_PROJECTION ,GL_TEXTURE.当中的哪一
个.其是通过glMatrixMode( ...) 来指定的.
但这三个矩阵其均是使用当前矩阵来进行相乘.所以为了避免之前的影响,我们会去使用glLoadIdentity(). 来将当前矩阵设置为单位
矩阵
[ 3.3.1 透视投影]
其的特点是: 与我们人眼所观察到物体对象是不一样的. 远处的东西看小些,近处的东西看大些, 但没有不清楚的功能.
透视投影流程:
1. 设置矩阵模型为GL_PROJECTION
2. 将当前矩阵设置为单位矩阵
3. 设置视景体,glFrustum
4. 根据glFrustum 的参数计算出一个矩阵.
5. 其与当前矩阵,
6. 其结果会保存在GL_PROJECTION矩阵当中.
7. 3D空间到2D屏幕上显示的时候,顶点其就会与此矩阵相乘.
注意:
平截头.其是由裁剪平面所组成的. 其包括4个侧面,顶面,底面.
裁剪平面与矩阵之间是什么关系呢.
工具函数:
gluPerspective 其是定义成一个视景体.
glFrustum其函数参数是指定近侧裁剪平面的两个角.
gluPerspective 其的参数是指定: y方向上视野的角度和纵横比( X/Y).
本文转载于:http://www.cnblogs.com/pengxinglove/archive/2010/12/31/1923371.html
最新技术文章: